

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# CodeBuild용 'Amazon ECR 이미지 리포지토리에 Docker 이미지 게시' 샘플
<a name="sample-docker"></a>

이 샘플은 빌드 출력으로 도커 이미지를 생산한 다음 도커 이미지를 Amazon Elastic Container Registry(Amazon ECR) 이미지 리포지토리에 푸시합니다. 이 샘플을 응용하여 도커 이미지를 Docker Hub에 푸시할 수도 있습니다. 자세한 내용은 ['Docker 이미지를 Amazon ECR에 게시' 샘플을 조정하여 Docker Hub로 푸시](sample-docker-docker-hub.md) 단원을 참조하십시오.

사용자 지정 도커 빌드 이미지(도커 허브의 `docker:dind`)를 사용하여 도커 이미지를 빌드하는 방법을 알아보려면 [도커 사용자 지정 이미지 샘플](sample-docker-custom-image.md) 단원을 참조하십시오.

이 샘플은 `golang:1.12`를 참조하여 테스트됩니다.

이 샘플에서는 도커 이미지를 빌드 출력으로 생성하는 새로운 다단계 Docker 빌드 기능을 사용합니다. 그런 다음, 도커 이미지를 Amazon ECR 이미지 리포지토리로 푸시합니다. 다단계 도커 이미지 빌드는 최종 도커 이미지의 크기를 줄이는 데 도움이 됩니다. 자세한 내용은 [Use multi-stage builds with Docker](https://docs.docker.com/engine/userguide/eng-image/multistage-build/)를 참조하십시오.

**중요**  
이 샘플을 실행하면 AWS 계정에 요금이 부과될 수 있습니다. 여기에는 Amazon S3, , AWS KMS CloudWatch Logs AWS CodeBuild 및 Amazon ECR과 관련된 AWS 리소스 및 작업에 대한 및 요금이 포함됩니다. 자세한 내용은 [CodeBuild 요금](https://aws.amazon.com/codebuild/pricing), [Amazon S3 요금](https://aws.amazon.com/s3/pricing), [AWS Key Management Service 요금](https://aws.amazon.com/kms/pricing), [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing), [Amazon Elastic Container Registry 요금](https://aws.amazon.com/ecr/pricing)을 참조하세요.

**Topics**
+ ['Amazon ECR에 Docker 이미지 게시' 샘플 실행](#sample-docker-running)
+ ['Docker 이미지를 Amazon ECR에 게시' 샘플을 조정하여 Docker Hub로 푸시](sample-docker-docker-hub.md)

## 'Amazon ECR에 Docker 이미지 게시' 샘플 실행
<a name="sample-docker-running"></a>

다음 절차에 따라 Amazon ECR에 Docker 이미지를 게시하는 샘플을 실행합니다. 이 샘플에 대한 자세한 내용은 [CodeBuild용 'Amazon ECR 이미지 리포지토리에 Docker 이미지 게시' 샘플](#sample-docker) 섹션을 참조하세요.

**이 샘플을 실행하려면**

1. Amazon ECR에 사용할 이미지 리포지토리가 이미 있으면 3단계로 이동하세요. 그렇지 않으면 AWS 루트 계정 또는 관리자 사용자 대신 사용자를 사용하여 Amazon ECR로 작업하는 경우이 문(*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1과 **\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1* 사이)을 사용자(또는 사용자가 연결된 IAM 그룹)에 추가합니다. AWS 루트 계정을 사용하는 것은 권장되지 않습니다.이 문을 사용하면 Docker 이미지를 저장하기 위한 Amazon ECR 리포지토리를 생성할 수 있습니다. 간결하게 나타내고 명령문 추가 위치를 알 수 있도록 줄임표(`...`)가 사용되었습니다. 어떤 명령문도 제거하지 않아야 하며, 이러한 줄임표는 정책에 입력하지 않아야 합니다. 자세한 내용은 사용 설명서의 [AWS Management Console을 사용한 인라인 정책 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)을 참조하세요.**

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

****  

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

------
**참고**  
이 정책을 수정하는 IAM 엔터티에는 정책을 수정하는 IAM의 권한이 있어야 합니다.

1. Amazon ECR에서 이미지 리포지토리를 생성합니다. 빌드 환경을 생성하고 빌드를 실행하는 리전과 동일한 AWS 리전에 리포지토리를 생성해야 합니다. 자세한 내용은 Amazon VPC 사용 설명서의 [리포지토리 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)을 참조하세요.** 이 리포지토리의 이름은 이 절차의 뒷부분에서 지정하는 리포지토리 이름(`IMAGE_REPO_NAME` 환경 변수에 의해 표시됨)과 일치해야 합니다. Amazon ECR 리포지토리 정책이 CodeBuild 서비스 IAM 역할에 대한 이미지 푸시 액세스를 허용하는지 확인합니다.

1.  AWS CodeBuild 서비스 역할에 연결한 정책에이 문(*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1*와 *\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1* 사이)을 추가합니다. 다음 명령문을 사용하면 CodeBuild가 도커 이미지를 Amazon ECR 리포지토리에 업로드할 수 있습니다. 간결하게 나타내고 명령문 추가 위치를 알 수 있도록 줄임표(`...`)가 사용되었습니다. 어떤 명령문도 제거하지 않아야 하며, 이러한 줄임표는 정책에 입력하지 않아야 합니다.

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

****  

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

------
**참고**  
이 정책을 수정하는 IAM 엔터티에는 정책을 수정하는 IAM의 권한이 있어야 합니다.

1. 이 주제의 [디렉터리 구조](#sample-docker-dir) 및 [파일](#sample-docker-files) 섹션에 설명된 대로 파일을 생성한 다음 S3 입력 버킷 또는 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다. 자세한 내용은AWS CodePipeline 사용 설명서의 [이미지 정의 파일 참조](https://docs.aws.amazon.com/codepipeline/latest/userguide/file-reference.html)를 참조하세요.**
**중요**  
`(root directory name)`은 업로드하지 말고, `(root directory name)` 안에 있는 파일만 업로드하십시오.  
S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. `(root directory name)`을 ZIP 파일에 추가하지 말고, `(root directory name)` 안에 있는 파일만 추가하십시오.

1. 빌드 프로젝트를 생성하고, 빌드를 실행하고, 빌드 정보를 확인합니다.

    콘솔을 사용하여 프로젝트를 생성할 경우:

   1.  [**Operating system**]에서 [**Ubuntu**]를 선택합니다.

   1.  **실행 시간**에서 **표준**을 선택합니다.

   1.  **이미지**에서 **aws/codebuild/standard:5.0**을 선택합니다.

   1.  다음 환경 변수를 추가합니다.
      +  *region-ID* 값이 있는 AWS\$1DEFAULT\$1REGION 
      +  *account-ID* 값이 있는 AWS\$1ACCOUNT\$1ID 
      +  최신 값이 있는 IMAGE\$1TAG 
      +  *Amazon-ECR-repo-name* 값이 있는 IMAGE\$1REPO\$1NAME 

    AWS CLI 를 사용하여 빌드 프로젝트를 생성하는 경우 `create-project` 명령에 대한 JSON 형식의 입력이 이와 비슷할 수 있습니다. (자리 표시자는 사용자의 값으로 바꾸십시오.)

   ```
   {
     "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. CodeBuild가 리포지토리에 도커 이미지를 성공적으로 푸시했는지 확인합니다.

   1. Amazon ECR 콘솔([https://console.aws.amazon.com/ecr/](https://console.aws.amazon.com/ecr/))을 엽니다.

   1. 리포지토리 이름을 선택합니다. **Image tag(이미지 태그)** 열에 이미지가 있어야 합니다.

### 디렉터리 구조
<a name="sample-docker-dir"></a>

이 샘플에서는 다음 디렉터리 구조를 가정합니다.

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

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

이 샘플은 다음 파일을 사용합니다.

`buildspec.yml`(`(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`(`(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"]
```

**참고**  
CodeBuild는 사용자 지정 도커 이미지에 대해 `ENTRYPOINT`를 재정의합니다.

# 'Docker 이미지를 Amazon ECR에 게시' 샘플을 조정하여 Docker Hub로 푸시
<a name="sample-docker-docker-hub"></a>

Amazon ECR 대신 Docker 이미지가 Docker Hub로 푸시되도록 'Docker 이미지를 Amazon ECR에 게시' 샘플을 조정하려면 샘플의 코드를 편집합니다. 샘플에 대한 자세한 내용은 [CodeBuild용 'Amazon ECR 이미지 리포지토리에 Docker 이미지 게시' 샘플](sample-docker.md) 및 ['Amazon ECR에 Docker 이미지 게시' 샘플 실행](sample-docker.md#sample-docker-running) 섹션을 참조하세요.
**참고**  
17.06 이전의 도커 버전을 사용하는 경우 `--no-include-email` 옵션을 제거합니다.

1. `buildspec.yml` 파일 내의 다음 Amazon ECR 특정 코드 행을 바꿉니다.

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

   다음 도커 허브 관련 코드 행으로 바꿉니다.

   ```
   ...
     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. 편집된 코드를 S3 입력 버킷 또는 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다.
**중요**  
`(root directory name)`은 업로드하지 말고, `(root directory name)` 안에 있는 파일만 업로드하십시오.  
S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. `(root directory name)`을 ZIP 파일에 추가하지 말고, `(root directory name)` 안에 있는 파일만 추가하십시오.

1. `create-project` 명령에 대한 JSON 형식 입력에서 다음 코드 행을 바꿉니다.

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

   다음 코드 행으로 바꿉니다.

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

1. 빌드 환경을 생성하고, 빌드를 실행하고, 관련 빌드 정보를 확인합니다.

1. 가 도커 이미지를 리포지토리에 AWS CodeBuild 성공적으로 푸시했는지 확인합니다. Docker Hub에 로그인하고, 리포지토리로 이동한 다음 [**Tags**] 탭을 선택합니다. `latest` 태그에 가장 최근의 [**Last Updated**] 값이 포함되어 있어야 합니다.