func pushImage()

in ecs-cli/modules/cli/image/image_app.go [144:218]


func pushImage(c *cli.Context, region string, dockerClient dockerclient.Client, ecrClient ecrclient.Client, stsClient stsclient.Client, taggingClient tagging.Client) error {
	registryID := c.String(flags.RegistryIdFlag)

	args := c.Args()

	if len(args) != 1 {
		return fmt.Errorf("ecs-cli push requires exactly 1 argument")
	}

	image := args[0]

	registryURI, repository, tag, err := splitImageName(image, "[:]", PushImageFormat)
	if err != nil {
		return err
	}

	// For tagging (need the full ARN) and ECR auth, we need the registry ID
	// We can get this either from the registry URI or from STS
	if registryURI == "" {
		registryID, err = getRegistryID(registryID, stsClient)
		if err != nil {
			return err
		}
	} else {
		registryID, err = getRegistryIDFromURI(registryURI)
		if err != nil {
			return err
		}
	}

	ecrAuth, err := getECRAuth(registryURI, registryID, stsClient, ecrClient)
	if err != nil {
		return err
	}

	repositoryURI := ecrAuth.Registry + "/" + repository

	// Tag image to ECR uri
	if registryURI == "" {
		if err := dockerClient.TagImage(image, repositoryURI, tag); err != nil {
			return err
		}
	}

	// Check if repo exists, create if not present
	if !ecrClient.RepositoryExists(repository) {
		if _, err := ecrClient.CreateRepository(repository); err != nil {
			return err
		}
	}

	if tagVal := c.String(flags.ResourceTagsFlag); tagVal != "" {
		tags, err := utils.GetTagsMap(tagVal)
		if err != nil {
			return err
		}
		logrus.WithField("repository", repository).Info("Tagging repository...")
		repoARN := getRepoARN(region, registryID, repository)
		logrus.Debugf("Using repository ARN: %s", repoARN)
		err = tagRepo(repoARN, tags, taggingClient)
		if err != nil {
			return err
		}
	}

	// Push Image to ECR
	dockerAuth := docker.AuthConfiguration{
		Username:      ecrAuth.Username,
		Password:      ecrAuth.Password,
		ServerAddress: ecrAuth.ProxyEndpoint,
	}

	err = dockerClient.PushImage(repositoryURI, tag, ecrAuth.Registry, dockerAuth)
	return err
}