

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. Multi-stage Las compilaciones de imágenes de Docker ayudan a reducir el tamaño de la imagen final de Docker. Para obtener más información, consulte [Use multi-stage builds with Docker](https://docs.docker.com/engine/userguide/eng-image/multistage-build/).

**importante**  
Al ejecutar este ejemplo, es posible que se produzcan cargos en tu 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 {{\#\#\# BEGIN ADDING STATEMENT HERE \#\#\#}} y{{\#\#\# END ADDING STATEMENT HERE \#\#\#}}) 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ó el entorno de compilación y en la que ejecutó la 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 {{\#\#\# BEGIN ADDING STATEMENT HERE \#\#\#}} y{{\#\#\# END ADDING STATEMENT HERE \#\#\#}}) a la política que ha asociado 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 **aws/codebuild/standard:5.0**. 

   1.  Añada las siguientes variables de entorno: 
      +  AWS\_DEFAULT\_REGION con un valor de {{region-ID}} 
      +  AWS\_ACCOUNT\_ID con un valor de {{account-ID}} 
      +  IMAGE\_TAG con un valor de Latest 
      +  IMAGE\_REPO\_NAME con un valor de {{Amazon-ECR-repo-name}} 

   Si utilizas el AWS CLI para crear el proyecto de compilación, la JSON-formatted entrada del `create-project` comando podría tener 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}}"
   }
   ```

1. Confirma que la imagen de Docker se ha insertado 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.