CodeBuild 위한 도커 샘플 - AWS CodeBuild

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

CodeBuild 위한 도커 샘플

이 샘플에서는 빌드 출력으로 Docker 이미지를 생산한 다음 Docker 이미지를 Amazon ECR (Amazon ECR) 이미지 리포지토리에 푸시합니다. 이 샘플을 응용하여 Docker 이미지를 Docker Hub에 푸시할 수도 있습니다. 자세한 정보는 샘플을 응용하여 이미지를 도커 허브에 푸시을 참조하십시오.

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

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

이 샘플에서는 Docker 이미지를 빌드 출력으로 생성하는 새로운 다단계 Docker 빌드 기능을 사용합니다. 그런 다음 Docker 이미지를 Amazon ECR 이미지 리포지토리로 푸시합니다. 다단계 Docker 이미지 빌드는 최종 Docker 이미지의 크기를 줄이는 데 도움이 됩니다. 자세한 내용은 Use multi-stage builds with Docker를 참조하십시오.

중요

이 샘플을 실행하면 AWS 계정에 요금이 발생할 수 있습니다. 여기에는 요금이 포함됩니다.AWS CodeBuild및AWSAmazon S3와 관련된 리소스 및 조치,AWS KMS, CloudWatch Logs 및 아마존 ECR 자세한 내용은 단원을 참조하십시오.CodeBuild 요금,Amazon S3 요금,AWS Key Management Service요금,Amazon CloudWatch 요금, 및Amazon Elastic 컨테이너 레지스트리 요금.

샘플 실행

이 샘플을 실행하려면

  1. 사용하려는 Amazon ECR에 이미지 리포지토리가 이미 있으면 3단계로 이동하십시오. 그렇지 않은 경우, IAM 사용자를 사용하는 경우AWS루트 계정 또는 관리자 IAM 사용자가 Amazon ECR을 사용하여 작업하려면 이 명령문을 추가합니다 (다음 사이에### 여기에 문 추가 시작 ###### 여기에 문 추가 끝내기 ###) 사용자 (또는 사용자가 연결된 IAM 그룹) 로 이동합니다. 사용AWS루트 계정은 권장되지 않습니다. 이 설명에서는 Docker 이미지를 저장할 Amazon ECR 리포지토리를 생성할 수 있습니다. 간결하게 나타내고 명령문 추가 위치를 알 수 있도록 줄임표(...)가 사용되었습니다. 어떤 명령문도 제거하지 않아야 하며, 이러한 줄임표는 정책에 입력하지 않아야 합니다. 자세한 내용은 단원을 참조하십시오.를 사용하여 인라인 정책 작업AWS Management ConsoleIAM 사용 설명서.

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    참고

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

  2. Amazon ECR에서 이미지 리포지토리를 생성합니다. 빌드 환경을 생성하고 빌드를 실행할 리전과 동일한 AWS 리전에 리포지토리를 생성해야 합니다. 자세한 내용은 단원을 참조하십시오.리포지토리 생성Amazon ECR 사용 설명서. 이 리포지토리의 이름은 이 절차의 뒷부분에서 지정하는 리포지토리 이름(IMAGE_REPO_NAME 환경 변수에 의해 표시됨)과 일치해야 합니다.

  3. 이 문장 추가 (사이)### 여기에 문 추가 시작 ###### 여기에 문 추가 끝내기 ###) 귀하가 귀하에게 첨부한 정책AWS CodeBuild서비스 역할. 이 설명을 사용하면 CodeBuild가 도커 이미지를 Amazon ECR 리포지토리에 업로드할 수 있습니다 간결하게 나타내고 명령문 추가 위치를 알 수 있도록 줄임표(...)가 사용되었습니다. 어떤 명령문도 제거하지 않아야 하며, 이러한 줄임표는 정책에 입력하지 않아야 합니다.

    { "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" }
    참고

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

  4. 이 주제의 “디렉터리 구조” 및 “파일” 섹션에 설명된 대로 파일을 생성한 다음, 이를 S3 입력 버킷이나 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다.

    중요

    (root directory name)은 업로드하지 말고, (root directory name) 안에 있는 파일만 업로드하십시오.

    S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. (root directory name)을 ZIP 파일에 추가하지 말고, (root directory name) 안에 있는 파일만 추가하십시오.

  5. 직접 CodeBuild의 단계에 따라 빌드 프로젝트를 생성하고 빌드를 실행하며 빌드 정보를 확인합니다.

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

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

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

    3. 이미지에서 aws/codebuild/standard:4.0을 선택합니다.

    4. 이 빌드 프로젝트를 사용하여 도커 이미지를 빌드하는 것이므로 Privileged(권한 있음)를 선택합니다.

      참고

      기본적으로 Docker 컨테이너는 모든 디바이스에 대한 액세스를 허용하지 않습니다. 권한 모드는 빌드 프로젝트의 Docker 컨테이너에 모든 디바이스에 대한 액세스 권한을 부여합니다. 자세한 내용은 Docker 문서 웹 사이트의 런타임 권한 및 Linux 기능을 참조하십시오.

    5. 다음 환경 변수를 추가합니다.

      • region-ID 값이 있는 AWS_DEFAULT_REGION

      • account-ID 값이 있는 AWS_ACCOUNT_ID

      • 최신 값이 있는 IMAGE_TAG

      • Amazon-ECR-repo-name 값이 있는 IMAGE_REPO_NAME

    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:4.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" } ], "privilegedMode": true }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
  6. CodeBuild가 도커 이미지를 리포지토리에 성공적으로 푸시했는지 확인합니다.

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

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

디렉터리 구조

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

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

Files

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

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에 푸시하려면 이 샘플 코드를 편집합니다.

참고

17.06 이전의 도커 버전을 사용하는 경우 --no-include-email 옵션을 제거합니다.

  1. 에서 Amazon ECR 관련 코드 행을 바꿉니다.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 ...

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

    ... 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 ...
  2. 수정한 코드를 S3 입력 버킷이나 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리로 업로드합니다.

    중요

    (root directory name)은 업로드하지 말고, (root directory name) 안에 있는 파일만 업로드하십시오.

    S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. (root directory name)을 ZIP 파일에 추가하지 말고, (root directory name) 안에 있는 파일만 추가하십시오.

  3. 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" } ] ...
  4. 직접 CodeBuild에 있는 단계를 수행하여 빌드 환경을 생성하고, 빌드를 실행하고, 관련된 빌드 정보를 확인합니다.

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

관련 리소스