이 샘플은 빌드 출력으로 도커 이미지를 생산한 다음 도커 이미지를 Amazon Elastic Container Registry(Amazon ECR) 이미지 리포지토리에 푸시합니다. 이 샘플을 응용하여 도커 이미지를 Docker Hub에 푸시할 수도 있습니다. 자세한 내용은 'Docker 이미지를 Amazon ECR에 게시' 샘플을 조정하여 Docker Hub로 푸시 단원을 참조하십시오.
사용자 지정 도커 빌드 이미지(도커 허브의 docker:dind
)를 사용하여 도커 이미지를 빌드하는 방법을 알아보려면 도커 사용자 지정 이미지 샘플 단원을 참조하십시오.
이 샘플은 golang:1.12
를 참조하여 테스트됩니다.
이 샘플에서는 도커 이미지를 빌드 출력으로 생성하는 새로운 다단계 Docker 빌드 기능을 사용합니다. 그런 다음, 도커 이미지를 Amazon ECR 이미지 리포지토리로 푸시합니다. 다단계 도커 이미지 빌드는 최종 도커 이미지의 크기를 줄이는 데 도움이 됩니다. 자세한 내용은 Use multi-stage builds with Docker
중요
이 샘플을 실행하면 AWS 계정에 요금이 발생할 수 있습니다. 여기에는 AWS CodeBuild 및 AWS 리소스에 대한 가능한 요금, Amazon S3, AWS KMS, CloudWatch Logs 및 Amazon ECR과 관련된 작업이 포함됩니다. 자세한 내용은 CodeBuild 요금
'Amazon ECR에 Docker 이미지 게시' 샘플 실행
다음 절차에 따라 Amazon ECR에 Docker 이미지를 게시하는 샘플을 실행합니다. 이 샘플에 대한 자세한 내용은 CodeBuild용 'Amazon ECR 이미지 리포지토리에 Docker 이미지 게시' 샘플 섹션을 참조하세요.
이 샘플을 실행하려면
-
Amazon ECR에 사용할 이미지 리포지토리가 이미 있으면 3단계로 이동하세요. 그렇지 않은 경우 AWS 루트 계정이나 관리자 사용자 대신 사용자를 사용하여 Amazon ECR로 작업하고 있는 경우
### BEGIN ADDING STATEMENT HERE ###
과### END ADDING STATEMENT HERE ###
사이의 명령문을 사용자(또는 사용자가 연결되어 있는 IAM 그룹)에 추가합니다. AWS 루트 계정을 사용하는 것은 권장되지 않습니다. 이 명령문을 사용하면 도커 이미지를 저장할 Amazon ECR 리포지토리를 생성할 수 있습니다. 간결하게 나타내고 명령문 추가 위치를 알 수 있도록 줄임표(...
)가 사용되었습니다. 어떤 명령문도 제거하지 않아야 하며, 이러한 줄임표는 정책에 입력하지 않아야 합니다. 자세한 내용은 사용 설명서의 AWS Management Console을 사용한 인라인 정책 작업을 참조하세요.{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }참고
이 정책을 수정하는 IAM 엔터티에는 정책을 수정하는 IAM의 권한이 있어야 합니다.
-
Amazon ECR에서 이미지 리포지토리를 생성합니다. 빌드 환경을 생성하고 빌드를 실행할 리전과 동일한 AWS 리전에 리포지토리를 생성해야 합니다. 자세한 내용은 Amazon VPC 사용 설명서의 리포지토리 생성을 참조하세요. 이 리포지토리의 이름은 이 절차의 뒷부분에서 지정하는 리포지토리 이름(
IMAGE_REPO_NAME
환경 변수에 의해 표시됨)과 일치해야 합니다. Amazon ECR 리포지토리 정책이 CodeBuild 서비스 IAM 역할에 대한 이미지 푸시 액세스를 허용하는지 확인합니다. -
### BEGIN ADDING STATEMENT HERE ###
과### END ADDING STATEMENT HERE ###
사이의 명령문을 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의 권한이 있어야 합니다.
-
이 주제의 디렉터리 구조 및 파일 섹션에 설명된 대로 파일을 생성한 다음, 이를 S3 입력 버킷이나 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다. 자세한 내용은 AWS CodePipeline 사용 설명서의 이미지 정의 파일 참조를 참조하세요.
중요
은 업로드하지 말고,(root directory name)
안에 있는 파일만 업로드하십시오.(root directory name)
S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오.
을 ZIP 파일에 추가하지 말고,(root directory name)
안에 있는 파일만 추가하십시오.(root directory name)
-
빌드 프로젝트를 생성하고, 빌드를 실행하고, 빌드 정보를 확인합니다.
콘솔을 사용하여 프로젝트를 생성할 경우:
-
[Operating system]에서 [Ubuntu]를 선택합니다.
-
실행 시간에서 표준을 선택합니다.
-
이미지에서 aws/codebuild/standard:5.0을 선택합니다.
-
다음 환경 변수를 추가합니다.
-
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: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
" } -
-
CodeBuild가 리포지토리에 도커 이미지를 성공적으로 푸시했는지 확인합니다.
-
Amazon ECR 콘솔(https://console.aws.amazon.com/ecr/
)을 엽니다. -
리포지토리 이름을 선택합니다. Image tag(이미지 태그) 열에 이미지가 있어야 합니다.
-
디렉터리 구조
이 샘플에서는 다음 디렉터리 구조를 가정합니다.
(root directory name)
├── buildspec.yml
└── Dockerfile
파일
이 샘플은 다음 파일을 사용합니다.
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
를 재정의합니다.