Este exemplo produz como saída de compilação de uma imagem do Docker e, depois, a envia a um repositório de imagens do Amazon Elastic Container Registry (Amazon ECR). Você pode adaptar esta amostra para enviar a imagem Docker para um Docker Hub. Para obter mais informações, consulte Adapte o exemplo “Publicar imagem do Docker no Amazon ECR” para enviar para o Docker Hub.
Para saber como compilar uma imagem de Docker usando uma imagem de compilação personalizada do Docker (docker:dind
no Docker Hub), consulte Docker no exemplo de imagem personalizada.
Esse exemplo foi testado fazendo referência a golang:1.12
Esse exemplo usa o novo recurso de compilações do Docker multiestágio, que produz uma imagem de Docker como saída de compilação. Depois, ele envia a imagem do Docker por push a um repositório de imagens do Amazon ECR. As compilações da imagem de Docker multiestágio ajudam a reduzir o tamanho da imagem de Docker final. Para obter mais informações, consulte Usar compilações multiestágio com o Docker
Importante
Executar esta amostra pode resultar em cobranças em sua conta AWS. Isso inclui possíveis cobranças pelo AWS CodeBuild e por recursos da AWS e ações relacionadas ao Amazon S3, ao AWS KMS, ao CloudWatch Logs e ao Amazon ECR. Para obter mais informações, consulte Preços do CodeBuild
Tópicos
Execute o exemplo “Publicar imagem do Docker no Amazon ECR”
Use o procedimento a seguir para executar o exemplo que publica uma imagem do Docker no Amazon ECR. Para obter mais informações sobre este exemplo, consulte Exemplo “Publicar imagem do Docker em um repositório de imagens do Amazon ECR” para CodeBuild.
Como executar este exemplo
-
Se você já possui um repositório de imagens no Amazon ECR que deseje usar, avance para a etapa 3. Caso contrário, se você estiver utilizando um usuário raiz da AWS, ou um usuário administrador para trabalhar com o Amazon ECR, adicione esta declaração (entre
### BEGIN ADDING STATEMENT HERE ###
e### END ADDING STATEMENT HERE ###
) ao usuário (ou ao grupo do IAM ao qual o usuário está associado). O uso de uma conta raiz da AWS não é recomendado. Esta declaração permite a criação de repositórios do Amazon ECR para armazenar imagens do Docker. As elipses (...
) são usadas para agilizar e para ajudá-lo a encontrar onde adicionar a declaração. Não remova nenhuma declaração e não digite essas elipses nas políticas. Para obter mais informações, consulte Working with inline policies using the AWS Management Console no Guia do usuário.{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }nota
A entidade do IAM que modifica essa política deve ter permissão no IAM para alterar políticas.
-
Crie um repositório de imagens no Amazon ECR. Crie o repositório na mesma região da AWS onde você cria seu ambiente de compilação e executa a compilação. Para obter mais informações, consulte Creating a repository no Guia do usuário do Amazon ECR. O nome desse repositório deve corresponder ao nome do repositório que você especificará posteriormente neste procedimento, representado pela variável de ambiente
IMAGE_REPO_NAME
. Garanta que a política de repositório do Amazon ECR conceda acesso push de imagens para o perfil do IAM do serviço CodeBuild. -
Adicione esta declaração (entre
### BEGIN ADDING STATEMENT HERE ###
e### END ADDING STATEMENT HERE ###
) à política associada à sua função de serviço do AWS CodeBuild. Essa declaração permite que o CodeBuild faça upload de imagens do Docker para repositórios do Amazon ECR. As elipses (...
) são usadas para agilizar e para ajudá-lo a encontrar onde adicionar a declaração. Não remova nenhuma declaração e não digite essas elipses nas políticas.{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload", "ecr:GetAuthorizationToken", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }nota
A entidade do IAM que modifica essa política deve ter permissão no IAM para alterar políticas.
-
Crie os arquivos conforme descrito nas seções Estrutura de diretório e Arquivos deste tópico e faça upload deles em um bucket de entrada do S3 ou em um repositório do AWS CodeCommit, do GitHub ou do Bitbucket. Para obter mais informações, consulte Image definitions file reference no Guia do usuário do AWS CodePipeline.
Importante
Não faça upload de
, apenas dos arquivos dentro de(root directory name)
.(root directory name)
Se você estiver usando um bucket de entrada do S3, crie um arquivo ZIP que contenha os arquivos e envie-o para o bucket de entrada. Não adicione
ao arquivo ZIP, apenas aos arquivos dentro de(root directory name)
.(root directory name)
-
Crie um projeto de compilação, execute a compilação e exiba suas informações.
Se você usar o console para criar seu projeto:
-
Para Operating system, selecione Ubuntu.
-
Em Runtime (Tempo de execução), selecione Standard (Padrão).
-
Em Imagem, selecione aws/codebuild/standard:5.0.
-
Adicione as seguintes variáveis de ambiente:
-
AWS_DEFAULT_REGION com o valor
region-ID
-
AWS_ACCOUNT_ID com o valor
account-ID
-
IMAGE_TAG com o valor Latest
-
IMAGE_REPO_NAME com o valor
Amazon-ECR-repo-name
-
Se você usar a AWS CLI para criar o projeto de compilação, a entrada em formato JSON para o comando
create-project
pode ser semelhante a esta. (Substitua os espaços reservados com seus próprios valores.){ "name": "sample-docker-project", "source": { "type": "S3", "location": "codebuild-
region-ID
-account-ID
-input-bucket/DockerSample
.zip" }, "artifacts": { "type": "NO_ARTIFACTS" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:5.0", "computeType": "BUILD_GENERAL1_SMALL", "environmentVariables": [ { "name": "AWS_DEFAULT_REGION", "value": "region-ID
" }, { "name": "AWS_ACCOUNT_ID", "value": "account-ID
" }, { "name": "IMAGE_REPO_NAME", "value": "Amazon-ECR-repo-name
" }, { "name": "IMAGE_TAG", "value": "latest" } ], }, "serviceRole": "arn:aws:iam::account-ID
:role/role-name
", "encryptionKey": "arn:aws:kms:region-ID
:account-ID
:key/key-ID
" } -
-
Confirme que o CodeBuild enviou com êxito a imagem do Docker ao repositório:
-
Abra o console do Amazon ECR em https://console.aws.amazon.com/ecr/
-
Escolha o nome do repositório. A imagem deve ser listada na coluna Image tag (Tag de imagem)
-
Estrutura de diretório
Essa amostra pressupõe esta estrutura de diretório.
(root directory name)
├── buildspec.yml
└── Dockerfile
Arquivos
Esta amostra usa estes arquivos.
buildspec.yml
(em
)(root directory
name)
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
Dockerfile
(em
)(root directory
name)
FROM golang:1.12-alpine AS build
#Install git
RUN apk add --no-cache git
#Get the hello world package from a GitHub repository
RUN go get github.com/golang/example/hello
WORKDIR /go/src/github.com/golang/example/hello
# Build the project and send the output to /bin/HelloWorld
RUN go build -o /bin/HelloWorld
FROM golang:1.12-alpine
#Copy the build's output binary from the previous build container
COPY --from=build /bin/HelloWorld /bin/HelloWorld
ENTRYPOINT ["/bin/HelloWorld"]
nota
O CodeBuild substitui o ENTRYPOINT
para as imagens personalizadas do Docker.