

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

# CodeBuild용 Docker 샘플
<a name="sample-docker-section"></a>

이 섹션에서는 Docker와 간의 샘플 통합에 대해 설명합니다 AWS CodeBuild.


| 샘플 | 설명 | 
| --- | --- | 
|  [CodeBuild용 Docker 사용자 지정 이미지 샘플](sample-docker-custom-image.md)  |  이 샘플은 CodeBuild 및 사용자 지정 Docker 빌드 이미지(Docker Hub의 `docker:dind`)를 사용하여 Docker 이미지를 빌드하고 실행합니다.  | 
|  [CodeBuild용 Docker 이미지 빌드 서버 샘플](sample-docker-server.md)  |  이 샘플은 Docker 빌드를 관리형 이미지 빌드 서버로 오프로드합니다.  | 
|  [CodeBuild용 Windows Docker 빌드 샘플](sample-windows-docker-custom-image.md)  |  이 샘플은 CodeBuild를 사용하여 Windows Docker 이미지를 빌드하고 실행합니다.  | 
|  [CodeBuild용 'Amazon ECR 이미지 리포지토리에 Docker 이미지 게시' 샘플](sample-docker.md)  |  이 샘플은 빌드 출력으로 도커 이미지를 생산한 다음 도커 이미지를 Amazon Elastic Container Registry(Amazon ECR) 이미지 리포지토리에 푸시합니다.  | 
|  [CodeBuild용 AWS Secrets Manager 샘플이 포함된 프라이빗 레지스트리](sample-private-registry.md)  |  이 샘플에서는 CodeBuild 실행 시간 환경으로서 프라이빗 레지스트리에 저장되는 Docker 이미지를 사용하는 방법을 보여줍니다.  | 

# CodeBuild용 Docker 사용자 지정 이미지 샘플
<a name="sample-docker-custom-image"></a>

다음 샘플은 및 사용자 지정 Docker 빌드 이미지(`docker:dind`Docker Hub의 )를 사용하여 Docker 이미지를 빌드 AWS CodeBuild 하고 실행합니다.

대신, Docker 지원을 통해 CodeBuild에서 제공하는 빌드 이미지를 사용하여 도커 이미지를 빌드하는 방법을 알아보려면 ['Amazon ECR에 Docker 이미지 게시' 샘플](sample-docker.md) 섹션을 참조하세요.

**중요**  
이 샘플을 실행하면 AWS 계정에 요금이 부과될 수 있습니다. 여기에는 CodeBuild와 Amazon S3 및 CloudWatch Logs와 관련된 AWS 리소스 AWS KMS및 작업에 대해 발생할 수 있는 요금이 포함됩니다. 자세한 내용은 [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)을 참조하세요.

**Topics**
+ [사용자 지정 이미지 샘플의 Docker 실행](#sample-docker-custom-image-running)

## 사용자 지정 이미지 샘플의 Docker 실행
<a name="sample-docker-custom-image-running"></a>

다음 절차에 따라 사용자 지정 이미지 샘플에서 Docker를 실행합니다. 이 샘플에 대한 자세한 내용은 [CodeBuild용 Docker 사용자 지정 이미지 샘플](#sample-docker-custom-image) 섹션을 참조하세요.

**사용자 지정 이미지 샘플에서 Docker를 실행하려면**

1. 이 주제의 [디렉터리 구조](#sample-docker-custom-image-dir) 및 [파일](#sample-docker-custom-image-files) 섹션에 설명된 대로 파일을 생성한 다음 S3 입력 버킷 또는 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다.
**중요**  
`(root directory name)`은 업로드하지 말고, `(root directory name)` 안에 있는 파일만 업로드하십시오.  
S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. `(root directory name)`을 ZIP 파일에 추가하지 말고, `(root directory name)` 안에 있는 파일만 추가하십시오.

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

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

   ```
   {
     "name": "sample-docker-custom-image-project",
     "source": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-input-bucket/DockerCustomImageSample.zip"
     },
     "artifacts": {
       "type": "NO_ARTIFACTS"
     },
     "environment": {
       "type": "LINUX_CONTAINER",
       "image": "docker:dind",
       "computeType": "BUILD_GENERAL1_SMALL",
       "privilegedMode": false
     },
     "serviceRole": "arn:aws:iam::account-ID:role/role-name",
     "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
   }
   ```
**참고**  
기본적으로 비 VPC 빌드에는 Docker 데몬이 활성화됩니다. VPC 빌드에 Docker 컨테이너를 사용하려면 Docker Docs 웹 사이트의 [런타임 권한 및 Linux 기능](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)을 참조하고 권한 부여 모드를 활성화합니다. 또한 Windows는 권한 모드를 지원하지 않습니다.

1. 빌드 결과를 확인하려면 빌드 로그에서 `Hello, World!` 문자열에 대해 찾아보십시오. 자세한 내용은 [빌드 세부 정보 보기](view-build-details.md) 단원을 참조하십시오.

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

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

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

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

이 샘플에 사용되는 운영 체제의 기본 이미지는 Ubuntu입니다. 샘플은 이러한 파일을 사용합니다.

`buildspec.yml`(`(root directory name)`에 있음)

```
version: 0.2

phases:
  pre_build:
    commands:
      - docker build -t helloworld .
  build:
    commands:
      - docker images
      - docker run helloworld echo "Hello, World!"
```

`Dockerfile`(`(root directory name)`에 있음)

```
FROM maven:3.3.9-jdk-8
 
RUN echo "Hello World"
```

# CodeBuild용 Docker 이미지 빌드 서버 샘플
<a name="sample-docker-server"></a>

다음 샘플은 Docker 빌드를 관리형 이미지 빌드 서버로 오프로드합니다. 이 샘플을 조정하여 CodeBuild 프로젝트 구성에서 전용 관리형 Docker 이미지 빌드 서버를 프로비저닝할 수 있습니다. 프로젝트에 대해 빌드가 적극적으로 실행되는 동안 프로비저닝된 인스턴스가 활성화되고 빌드가 실행되지 않으면 인스턴스가 중지됩니다. 프로비저닝된 인스턴스는 재활용되기 전에 최대 1개월 동안 저장됩니다. 자세한 내용은 [CodeBuild Docker 서버 기능](https://aws.amazon.com/blogs//aws/accelerate-ci-cd-pipelines-with-the-new-aws-codebuild-docker-server-capability)을 참조하세요.

**중요**  
이 샘플을 실행하면 AWS 계정에 요금이 부과될 수 있습니다. 여기에는 CodeBuild와 Amazon S3 및 CloudWatch Logs와 관련된 AWS 리소스 AWS KMS및 작업에 대해 발생할 수 있는 요금이 포함됩니다. 자세한 내용은 [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)을 참조하세요.

**Topics**
+ [Docker 서버 구성](#sample-docker-server-running)

## Docker 서버 구성
<a name="sample-docker-server-running"></a>

다음 절차에 따라 Docker 워크로드를 관리하고 Docker 이미지 계층을 저장하는 CodeBuild 프로젝트의 전용 컴퓨팅 환경을 프로비저닝합니다.

**Docker 서버를 구성하려면**

1. 이 주제의 [디렉터리 구조](#sample-docker-server-dir) 및 [파일](#sample-docker-server-files) 섹션에 설명된 대로 파일을 생성한 다음 S3 입력 버킷 또는 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다.
**중요**  
`(root directory name)`은 업로드하지 말고, `(root directory name)` 안에 있는 파일만 업로드하십시오.  
S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. `(root directory name)`을 ZIP 파일에 추가하지 말고, `(root directory name)` 안에 있는 파일만 추가하십시오.

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

   1. 콘솔의 **환경** 섹션에서 **추가 구성**을 선택하고 **Docker 서버 구성**으로 이동한 다음 **이 프로젝트에 대해 Docker 서버 활성화**를 선택합니다. 그런 다음 **Docker 서버 컴퓨팅 유형**을 선택하고 **레지스트리 자격 증명**을 제공할 수 있습니다.

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

      ```
      {
        "name": "sample-docker-custom-image-project",
        "source": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-input-bucket/DockerServerSample.zip"
        },
        "artifacts": {
          "type": "NO_ARTIFACTS"
        },
        "environment": {
          "type": "LINUX_CONTAINER",
          "image": "aws/codebuild/amazonlinux-x86_64-standard:5.0",
          "computeType": "BUILD_GENERAL1_LARGE",
          "dockerServer": [ 
               { 
                  "computeType": "BUILD_GENERAL1_LARGE",
                  "securityGroupIds": [ "security-groups-ID" ]
               }
            ]
        },
        "serviceRole": "arn:aws:iam::account-ID:role/role-name"
      }
      ```
**참고**  
Docker 서버에 대해 구성된 보안 그룹은 프로젝트에 구성된 VPC의 수신 네트워크 트래픽을 허용해야 합니다. 포트 9876에서 수신을 허용해야 합니다.

1. 빌드 결과를 확인하려면 빌드 로그에서 `Hello, World!` 문자열에 대해 찾아보십시오. 자세한 내용은 [빌드 세부 정보 보기](view-build-details.md) 단원을 참조하십시오.

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

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

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

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

이 샘플에 사용되는 운영 체제의 기본 이미지는 Ubuntu입니다. 샘플은 이러한 파일을 사용합니다.

`buildspec.yml`(`(root directory name)`에 있음)

```
version: 0.2

phases:
  build:
    commands:
      - docker buildx build -t helloworld --load .
      - docker run helloworld echo "Hello, World!"
```

`Dockerfile`(`(root directory name)`에 있음)

```
FROM public.ecr.aws/amazonlinux/amazonlinux:latest 
 
RUN echo "Hello World"
```

# CodeBuild용 Windows Docker 빌드 샘플
<a name="sample-windows-docker-custom-image"></a>

다음 샘플은 CodeBuild를 사용하여 Windows Docker 이미지를 빌드하고 실행합니다.

**Topics**
+ [Windows Docker 빌드 샘플 실행](#sample-windows-docker-build-running)

## Windows Docker 빌드 샘플 실행
<a name="sample-windows-docker-build-running"></a>

다음 절차에 따라 Windows Docker 빌드를 실행합니다.

**Windows Docker 빌드 샘플을 실행하려면**

1. 이 주제의 [디렉터리 구조](#sample-windows-docker-custom-image-dir) 및 [파일](#sample-windows-docker-custom-image-files) 섹션에 설명된 대로 파일을 생성한 다음 S3 입력 버킷 또는 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다.
**중요**  
`(root directory name)`은 업로드하지 말고, `(root directory name)` 안에 있는 파일만 업로드하십시오.  
S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. `(root directory name)`을 ZIP 파일에 추가하지 말고, `(root directory name)` 안에 있는 파일만 추가하십시오.

1. `WINDOWS_EC2` 플릿을 생성합니다.

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

   ```
   {
     "name": "fleet-name",
     "baseCapacity": 1,
     "environmentType": "WINDOWS_EC2",
     "computeType": "BUILD_GENERAL1_MEDIUM"
   }
   ```

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

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

   ```
   {
     "name": "project-name",
     "source": {
       "type": "S3",
       "location": "bucket-name/DockerImageSample.zip"
     },
     "artifacts": {
       "type": "NO_ARTIFACTS"
     },
     "environment": {
       "type": "WINDOWS_EC2",
       "image": "Windows",
       "computeType": "BUILD_GENERAL1_MEDIUM",
       "fleet": {
          "fleetArn": "fleet-arn"
       }
     },
     "serviceRole": "arn:aws:iam::account-ID:role/role-name"
   }
   ```

1. 빌드 결과를 확인하려면 빌드 로그에서 `Hello, World!` 문자열에 대해 찾아보십시오. 자세한 내용은 [빌드 세부 정보 보기](view-build-details.md) 단원을 참조하십시오.

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

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

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

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

이 샘플에 사용되는 운영 체제의 기본 이미지는 `mcr.microsoft.com/windows/servercore:ltsc2022`입니다. 샘플은 이러한 파일을 사용합니다.

`buildspec.yml`(`(root directory name)`에 있음)

```
version: 0.2

phases:
  pre_build:
    commands:
      - docker build -t helloworld .
  build:
    commands:
      - docker images
      - docker run helloworld powershell -Command "Write-Host 'Hello World!'"
```

`Dockerfile`(`(root directory name)`에 있음)

```
FROM mcr.microsoft.com/windows/servercore:ltsc2022

RUN powershell -Command "Write-Host 'Hello World'"
```

# 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**] 값이 포함되어 있어야 합니다.

# CodeBuild용 AWS Secrets Manager 샘플이 포함된 프라이빗 레지스트리
<a name="sample-private-registry"></a>

 이 샘플은 프라이빗 레지스트리에 AWS CodeBuild 런타임 환경으로 저장된 Docker 이미지를 사용하는 방법을 보여줍니다. 프라이빗 레지스트리의 보안 인증은 AWS Secrets Manager에 저장됩니다. 프라이빗 레지스트리는 모두 CodeBuild와 함께 작동합니다. 이 샘플은 Docker Hub를 사용합니다.

**참고**  
보안 암호는 작업에 표시되며 파일에 기록될 때 가려지지 않습니다.

**Topics**
+ [프라이빗 레지스트리 샘플 요구 사항](#sample-private-registry-requirements)
+ [프라이빗 레지스트리로 CodeBuild 프로젝트 생성](private-registry-sample-create-project.md)
+ [자체 호스팅 러너에 대한 프라이빗 레지스트리 자격 증명 구성](private-registry-sample-configure-runners.md)

## 프라이빗 레지스트리 샘플 요구 사항
<a name="sample-private-registry-requirements"></a>

 에서 프라이빗 레지스트리를 사용하려면 다음이 있어야 AWS CodeBuild합니다.
+  Docker Hub 보안 인증을 저장하는 Secrets Manager 보안 암호. 보안 인증은 프라이빗 리포지토리 액세스에 사용합니다.
**참고**  
생성한 보안 암호에 대해 요금이 청구됩니다.
+  프라이빗 리포지토리 또는 계정 
+  Secrets Manager 보안 암호 액세스 권한을 부여하는 CodeBuild 서비스 역할의 IAM 정책 

 다음 단계를 따라 해당 리소스를 만든 다음, 프라이빗 레지스트리에 저장된 도커 이미지를 사용하여 CodeBuild 빌드 프로젝트를 생성합니다.

# 프라이빗 레지스트리로 CodeBuild 프로젝트 생성
<a name="private-registry-sample-create-project"></a>

1. 프리 프라이빗 리포지토리 생성 방법에 대한 자세한 내용은 [Docker Hub의 리포지토리](https://docs.docker.com/docker-hub/repos/)를 참조하십시오. 또한 터미널에서 다음 명령을 실행하여 이미지를 가져오고, 이미지의 ID를 확보하고, 새 리포지토리로 푸시할 수 있습니다.

   ```
   docker pull amazonlinux
   docker images amazonlinux --format {{.ID}}
   docker tag image-id your-username/repository-name:tag
   docker login
   docker push your-username/repository-name
   ```

1.  *AWS Secrets Manager 사용 설명서*의 [AWS Secrets Manager 보안 암호 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) 단계를 따릅니다.

   

   1.  3단계의 **보안 암호 유형 선택**에서 **다른 유형의 보안 암호**를 선택합니다.

   1. **키/값 페어**에서 Docker Hub 사용자 이름에 대한 키-값 페어와 Docker Hub 암호에 대한 키-값 페어를 하나씩 생성합니다.

   1.  [AWS Secrets Manager 보안 암호 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)의 단계를 계속 따릅니다.

   1.  키는 Docker Hub 보안 인증에 해당하므로 5단계의 **자동 교체 구성** 페이지에서 이 옵션을 끕니다.

   1.  [AWS Secrets Manager 보안 암호 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)의 단계에 따라 완료합니다.

    자세한 내용은 [AWS Secrets Manager란 무엇입니까?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/)를 참조하세요.

1.  콘솔에서 AWS CodeBuild 프로젝트를 생성하면 CodeBuild가 필요한 권한을 연결합니다. 이외의 AWS KMS 키를 사용하는 경우 서비스 역할에 추가`DefaultEncryptionKey`해야 합니다. 자세한 내용은 IAM 사용 설명서의 [역할 수정(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_modify.html#roles-managingrole-editing-console)을 참조하세요.**

    Secrets Manager에서 서비스 역할이 작동하려면 최소한 `secretsmanager:GetSecretValue` 권한이 있어야 합니다.  
![\[서비스 역할 구성입니다.\]](http://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/images/private-registry-sample-iam.png)

1.  콘솔을 사용하여 환경이 프라이빗 레지스트리에 저장되는 프로젝트를 생성하려면 프로젝트를 생성하면서 다음을 수행합니다. 자세한 내용은 [빌드 프로젝트 만들기(콘솔)](create-project.md#create-project-console) 단원을 참조하세요.
**참고**  
 VPC에 프라이빗 레지스트리가 있는 경우 퍼블릭 인터넷 액세스가 가능해야 합니다. CodeBuild는 VPC의 프라이빗 IP 주소에서 이미지를 끌어올 수 없습니다.

   1.  **환경 이미지**에서 **사용자 지정 이미지**를 선택합니다.

   1.  **환경 유형**에서 **Linux** 또는 **Windows**를 선택합니다.

   1.  **이미지 레지스트리**의 경우 **다른 레지스트리**를 선택합니다.

   1.  **외부 레지스트리 URL**에 이미지 위치를 입력하고 **레지스트리 보안 인증 - 선택 사항**에 Secrets Manager 보안 인증의 ARN 또는 이름을 입력합니다.
**참고**  
 현재 리전에 보안 인증이 없을 경우 ARN을 사용해야 합니다. 다른 리전에 있는 보안 인증의 이름은 사용할 수 없습니다.

# 자체 호스팅 러너에 대한 프라이빗 레지스트리 자격 증명 구성
<a name="private-registry-sample-configure-runners"></a>

다음 지침에 따라 자체 호스팅 러너에 대한 레지스트리 자격 증명을 구성합니다.

**참고**  
이러한 자격 증명은 이미지가 프라이빗 레지스트리의 자격 증명으로 재정의되는 경우에만 사용됩니다.

------
#### [ AWS Management Console ]

1. [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) AWS CodeBuild 콘솔을 엽니다.

1. 빌드 프로젝트를 생성하거나 기존 프로젝트를 선택합니다. 자세한 내용은 [빌드 프로젝트 만들기(콘솔)](create-project.md#create-project-console) 및 [빌드 프로젝트 설정 변경(콘솔)](change-project.md#change-project-console) 섹션을 참조하세요.

1.  **환경**에서 **추가 구성**을 선택합니다.

1.  **추가 구성**에서 **레지스트리 자격 증명 - 선택** 사항으로에서 보안 암호의 이름 또는 ARN AWS Secrets Manager 을 입력합니다.  
![\[레지스트리 자격 증명 구성입니다.\]](http://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/images/registry-credential.png)

------
#### [ AWS CLI ]

1. 새 프로젝트를 생성하려면 **create-project** 명령을 실행합니다.

   ```
   aws codebuild create-project \
       --name project-name \
       --source type=source-type,location=source-location \
       --environment "type=environment-type,image=image,computeType=compute-type,registryCredential={credentialProvider=SECRETS_MANAGER,credential=secret-name-or-arn},imagePullCredentialsType=CODEBUILD|SERVICE_ROLE" \
       --artifacts type=artifacts-type \
       --service-role arn:aws:iam::account-ID:role/service-role/service-role-name
   ```

1. 기존 프로젝트를 업데이트하려면 **update-project** 명령을 실행합니다.

   ```
   aws codebuild update-project \
       --name project-name \
       --environment "type=environment-type,image=image,computeType=compute-type,registryCredential={credentialProvider=SECRETS_MANAGER,credential=secret-name-or-arn}"
   ```

------