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
}