Este ejemplo produce como salida de la compilación una imagen de Docker y la inserta después en un repositorio de imágenes de Amazon Elastic Container Registry (Amazon ECR). Puede adaptar este ejemplo para insertar la imagen de Docker en Docker Hub. Para obtener más información, consulte Adaptación del ejemplo de publicación de una imagen de Docker en Amazon ECR para insertar en Docker Hub.
Para obtener información acerca de cómo crear una imagen de Docker utilizando una imagen de compilación de Docker personalizada (docker:dind
en Docker Hub), consulte nuestro Ejemplo de Docker en una imagen personalizada.
Este ejemplo se ha probado con golang:1.12
.
Utiliza la nueva característica de fases múltiples de Docker, que produce una imagen de Docker como salida de la compilación. A continuación, envía la imagen de Docker a un repositorio de imágenes de Amazon ECR. Las compilaciones de imágenes de fases múltiples de Docker ayudan a reducir el tamaño de la imagen de Docker final. Para obtener más información, consulte Use multi-stage builds with Docker
importante
La ejecución de este ejemplo puede producir cargos en su cuenta de AWS. Estos incluyen posibles cargos por AWS CodeBuild y por acciones y recursos de AWS relacionados con Amazon S3, AWS KMS, Registros de CloudWatch y Amazon ECR. Para obtener más información, consulte Precios de CodeBuild
Temas
Ejecución del ejemplo de publicación de una imagen de Docker en Amazon ECR
Utilice el siguiente procedimiento para ejecutar el ejemplo que publica una imagen de Docker en Amazon ECR. Para obtener más información sobre este ejemplo, consulte Ejemplo de publicación de una imagen de Docker en un repositorio de imágenes de Amazon ECR para CodeBuild.
Para ejecutar este ejemplo
-
Si ya tiene un repositorio de imágenes en Amazon ECR que desee utilizar, vaya al paso 3. De lo contrario, si utiliza un usuario en lugar de una cuenta de usuario raíz de AWS o un usuario administrador para trabajar con Amazon ECR, añada esta instrucción (entre
### BEGIN ADDING STATEMENT HERE ###
y### END ADDING STATEMENT HERE ###
) para el usuario (o el grupo de IAM con el que está asociado el usuario). No se recomienda utilizar una cuenta raíz de AWS. Esta instrucción permite crear repositorios de Amazon ECR para almacenar imágenes de Docker. Los puntos suspensivos (...
) se usan por motivos de brevedad y para ayudarle a encontrar el lugar donde debe añadir la instrucción. No elimine ninguna instrucción ni incluya estos puntos suspensivos en la política. Para obtener más información, consulte el artículo relacionado con el uso de políticas integradas a través de la AWS Management Console en la Guía del usuario.{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }nota
La entidad de IAM que modifica esta política debe tener permiso en IAM para modificar políticas.
-
Cree un repositorio de imágenes en Amazon ECR. No olvide crear el repositorio en la misma región de AWS en la que va a crear el entorno de compilación y a ejecutar la compilación. Para obtener más información, consulte Crear un repositorio en la Guía del usuario de Amazon ECR. El nombre del repositorio debe coincidir con el que especificará más adelante en este procedimiento, representado por la variable de entorno
IMAGE_REPO_NAME
. Asegúrese de que la política de repositorios de Amazon ECR conceda acceso para envío de imágenes a su rol de IAM del servicio CodeBuild. -
Añada esta instrucción (entre
### BEGIN ADDING STATEMENT HERE ###
y### END ADDING STATEMENT HERE ###
) a la política asociada a al rol de servicio de AWS CodeBuild. Esta instrucción permite a CodeBuild cargar imágenes de Docker en repositorios de Amazon ECR. Los puntos suspensivos (...
) se usan por motivos de brevedad y para ayudarle a encontrar el lugar donde debe añadir la instrucción. No elimine ninguna instrucción ni incluya estos puntos suspensivos en la política.{ "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
La entidad de IAM que modifica esta política debe tener permiso en IAM para modificar políticas.
-
Cree los archivos tal y como se describe en las secciones Estructura de directorios y Archivos de este tema y cárguelos en un bucket de entrada de S3 o en un repositorio de AWS CodeCommit, GitHub o Bitbucket. Para obtener más información, consulte Referencia del archivo de definiciones de imágenes en la Guía del usuario de AWS CodePipeline.
importante
No cargue
, solo los archivos incluidos en(root directory name)
.(root directory name)
Si utiliza un bucket de entrada de S3, no olvide crear un archivo ZIP que contenga los archivos y cárguelo en el bucket de entrada. No añada
al archivo ZIP, solo los archivos incluidos en(root directory name)
.(root directory name)
-
Cree un proyecto de compilación, ejecute la compilación y vea la información de compilación.
Si utiliza la consola para crear un proyecto:
-
En Operating system (Sistema operativo), elija Ubuntu.
-
En Runtime, elija Standard (Estándar).
-
En Imagen, elija aws/codebuild/standard:5.0.
-
Añada las siguientes variables de entorno:
-
AWS_DEFAULT_REGION con un valor de
region-ID
-
AWS_ACCOUNT_ID con un valor de ID de
account-ID
-
IMAGE_TAG con un valor de Latest
-
IMAGE_REPO_NAME con un valor de
Amazon-ECR-repo-name
-
Si usa la AWS CLI para crear el proyecto de compilación, es posible que el resultado con formato JSON del comando
create-project
tenga un aspecto similar al siguiente. (Sustituya los marcadores de posición por sus propios 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 CodeBuild haya insertado correctamente la imagen de Docker en el repositorio:
-
Abra la consola de Amazon ECR en https://console.aws.amazon.com/ecr/
. -
Elija el nombre del repositorio. La imagen debe mostrarse en la columna Image tag (Etiqueta de imagen).
-
Estructura de directorios
En este ejemplo se presupone que existe esta estructura de directorios.
(root directory name)
├── buildspec.yml
└── Dockerfile
Archivos
Este ejemplo usa los siguientes archivos.
buildspec.yml
(in
)(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
(in
)(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
CodeBuild anula las imágenes de ENTRYPOINT
y las sustituye por imágenes de Docker personalizadas.