

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Ejemplo de «Publicar una imagen de Docker en un repositorio de imágenes de Amazon ECR» para CodeBuild
<a name="sample-docker"></a>

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](sample-docker-docker-hub.md).

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](sample-docker-custom-image.md).

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](https://docs.docker.com/engine/userguide/eng-image/multistage-build/).

**importante**  
La ejecución de este ejemplo podría generar cargos en su cuenta. AWS Estos incluyen posibles cargos por AWS CodeBuild y por AWS los recursos y acciones relacionados con Amazon S3 AWS KMS, CloudWatch Logs y Amazon ECR. Para obtener más información, consulte [CodeBuild los precios, precios](https://aws.amazon.com/codebuild/pricing) de [Amazon S3, precios](https://aws.amazon.com/s3/pricing), [AWS Key Management Service precios](https://aws.amazon.com/kms/pricing) de [Amazon y CloudWatch precios](https://aws.amazon.com/cloudwatch/pricing) de [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/pricing).

**Topics**
+ [Ejecución del ejemplo de publicación de una imagen de Docker en Amazon ECR](#sample-docker-running)
+ [Adaptación del ejemplo de publicación de una imagen de Docker en Amazon ECR para insertar en Docker Hub](sample-docker-docker-hub.md)

## Ejecución del ejemplo de publicación de una imagen de Docker en Amazon ECR
<a name="sample-docker-running"></a>

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 «Publicar una imagen de Docker en un repositorio de imágenes de Amazon ECR» para CodeBuild](#sample-docker).

**Para ejecutar este ejemplo**

1. 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 AWS raíz o un usuario administrador para trabajar con Amazon ECR, añada esta declaración (entre *\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1* y*\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1*) al usuario (o grupo de IAM al que está asociado el usuario). No se recomienda usar una cuenta AWS root. Esta declaración permite la creación de 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 Consola de administración de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console) en la *Guía del usuario*. 

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:CreateRepository"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**nota**  
La entidad de IAM que modifica esta política debe tener permiso en IAM para modificar políticas.

1. Cree un repositorio de imágenes en Amazon ECR. Asegúrese de crear el repositorio en la misma AWS región en la que creó y ejecutó el entorno de compilación. Para obtener más información, consulte [Crear un repositorio](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html) 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 push de imágenes para su función de IAM CodeBuild de servicio. 

1. Añada esta declaración (entre *\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1* y*\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1*) a la política que asoció a su función de AWS CodeBuild servicio. Esta declaración permite cargar imágenes de Docker CodeBuild a los 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. 

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:BatchCheckLayerAvailability",
                   "ecr:CompleteLayerUpload",
                   "ecr:GetAuthorizationToken",
                   "ecr:InitiateLayerUpload",
                   "ecr:PutImage",
                   "ecr:UploadLayerPart"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**nota**  
La entidad de IAM que modifica esta política debe tener permiso en IAM para modificar políticas.

1. Cree los archivos tal y como se describe en las [Archivos](#sample-docker-files) secciones [Estructura de directorios](#sample-docker-dir) y de este tema y, a continuación, cárguelos en un depósito de entrada de S3 o en un repositorio AWS CodeCommit de GitHub Bitbucket. Para obtener más información, consulte [Referencia del archivo de definiciones de imágenes](https://docs.aws.amazon.com/codepipeline/latest/userguide/file-reference.html) en la *Guía del usuario de AWS CodePipeline *.
**importante**  
No cargue `(root directory name)`, solo los archivos incluidos en `(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 `(root directory name)` al archivo ZIP, solo los archivos incluidos en `(root directory name)`.

1. 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:

   1.  En **Operating system (Sistema operativo)**, elija **Ubuntu**. 

   1.  En **Runtime**, elija **Standard (Estándar)**. 

   1.  **En **Imagen, selecciona**: 5.0. aws/codebuild/standard** 

   1.  Añada las siguientes variables de entorno: 
      +  AWS\$1DEFAULT\$1REGION con un valor de *region-ID* 
      +  AWS\$1ACCOUNT\$1ID con un valor de *account-ID* 
      +  IMAGE\$1TAG con un valor de Latest 
      +  IMAGE\$1REPO\$1NAME con un valor de *Amazon-ECR-repo-name* 

   Si utilizas el AWS CLI para crear el proyecto de compilación, la entrada del comando con formato JSON podría tener un aspecto similar al siguiente. `create-project` (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"
   }
   ```

1. Confirma que la imagen de Docker se insertó CodeBuild correctamente en el repositorio:

   1. Abra la consola Amazon ECR en [https://console.aws.amazon.com/ecr/](https://console.aws.amazon.com/ecr/).

   1. Elija el nombre del repositorio. La imagen debe mostrarse en la columna **Image tag (Etiqueta de imagen)**.

### Estructura de directorios
<a name="sample-docker-dir"></a>

En este ejemplo se presupone que existe esta estructura de directorios.

```
(root directory name)
├── buildspec.yml
└── Dockerfile
```

### Archivos
<a name="sample-docker-files"></a>

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 `ENTRYPOINT` de Docker personalizadas.

# Adaptación del ejemplo de publicación de una imagen de Docker en Amazon ECR para insertar en Docker Hub
<a name="sample-docker-docker-hub"></a>

Para adaptar el ejemplo de publicación de una imagen de Docker en Amazon ECR de modo que la imagen de Docker se inserte en Docker Hub en lugar de en Amazon ECR, edite el código del ejemplo. Para obtener más información sobre el ejemplo, consulte [Ejemplo de «Publicar una imagen de Docker en un repositorio de imágenes de Amazon ECR» para CodeBuild](sample-docker.md) y [Ejecución del ejemplo de publicación de una imagen de Docker en Amazon ECR](sample-docker.md#sample-docker-running).
**nota**  
Si está utilizando una versión de Docker anterior a la 17.06, quite la opción `--no-include-email`.

1. Sustituya estas líneas de código específicas de Amazon ECR en el archivo `buildspec.yml`:

   ```
   ...
     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
   ...
   ```

   Por estas líneas de código específicas de Docker Hub:

   ```
   ...
     pre_build:
       commands:
         - echo Logging in to Docker Hub...
         # Type the command to log in to your Docker Hub account here.          
     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 $IMAGE_REPO_NAME:$IMAGE_TAG
     post_build:
       commands:
         - echo Build completed on `date`
         - echo Pushing the Docker image...
         - docker push $IMAGE_REPO_NAME:$IMAGE_TAG
   ...
   ```

1. Sube el código editado a un depósito de entrada de S3 o a un AWS CodeCommit repositorio GitHub de Bitbucket. 
**importante**  
No cargue `(root directory name)`, solo los archivos incluidos en `(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 `(root directory name)` al archivo ZIP, solo los archivos incluidos en `(root directory name)`.

1. Sustituya estas líneas de código de la entrada con formato JSON del comando `create-project`:

   ```
   ...
       "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"
         }
       ]
   ...
   ```

   Por estas líneas de código:

   ```
   ...
       "environmentVariables": [
         {
           "name": "IMAGE_REPO_NAME",
           "value": "your-Docker-Hub-repo-name"
         },
         {
           "name": "IMAGE_TAG",
           "value": "latest"
         }
       ]
   ...
   ```

1. Cree un entorno de compilación, ejecute la compilación y vea la información de compilación relacionada.

1. Confirma que la imagen de Docker se insertó AWS CodeBuild correctamente en el repositorio. Inicie sesión en Docker Hub, vaya al repositorio y elija la pestaña **Tags**. La etiqueta `latest` debe contener un valor de **Last Updated** muy reciente.