티스토리 뷰

SpringBoot로 생성한 프로젝트를 도커 이미지로 만들어서 ECR에 올리는 과정을 알아보겠습니다.

 

이번에 사용할 AWS 서비스들은 다음과 같습니다.

 

  • CodeCommit
  • CodeBuild
  • ECR

 

1. SpringBoot로 프로젝트 생성

이미 SpringBoot로 생성한 프로젝트를 사용하겠습니다. SpringBoot, Java, Gradle 빌드를 사용하는 프로젝트입니다. (각자 상황에 맞는 Controller 등을 생성해 주세요...)

 

2. Dockerfile 작성하기

도커 이미지를 생성하기 위해 프로젝트 루트 디렉토리에 Dockerfile을 추가하고 아래와 같은 내용을 작성합니다.

FROM centos:7
RUN yum -y update &&  yum -y install initscripts && yum -y install git && yum -y install java-11-openjdk && yum -y install wget && yum -y install telnet && yum -y install net-tools && yum clean all && yum clean metadata && rm -rf /var/cache/yum/*
VOLUME /tmp
ARG JAR_FILE
WORKDIR /
COPY ${JAR_FILE} JAR_파일명.jar
COPY entrypoint.sh entrypoint.sh
RUN chmod 755 /entrypoint.sh
RUN mkdir /logs
RUN touch /logs/프로젝트명.log
WORKDIR /
EXPOSE 7777/tcp
ENTRYPOINT ["sh", "entrypoint.sh"]

 

FROM centos:7 : centos:7을 기반으로 도커 이미지를 생성

RUN : 패키지 설치 등에 사용 (Image Layer 생성)

VOLUME : 호스트OS와 공유할 디렉토리 (메모리 공유)

ARG : 빌드 시점에만 사용되는 변수 지정

WORKDIR : 명령을 실행하기 위한 디렉토리를 지정

COPY : 호스트OS의 파일 또는 디렉토리를 컨테이너 안의 경로로 복사

EXPOSE : 해당 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기중 이라는것을 표시

ENTRYPOINT : 컨테이너가 실행될 때 명령어 및 인자값 전달하여 실행 (단, docker run 명령에 쉘 명령어 및 인자값 전달할 경우 쉘 명령어는 영향을 받지 않으며, 인자값만 영향을 받습니다.)

 

entrypoint.sh 파일은 다음과 같습니다. application.yml에서 prod로 설정한 것을 기준으로 jar 파일을 실행합니다.

#!/bin/bash

java -Dspring.profiles.active=prod -jar /JAR_파일명.jar

 

3. buildspec.yml 파일 작성하기

생성한 도커 이미지를 ECR로 업로드하기 위해 CodeBuild를 사용하겠습니다. CodeBuild를 실행하기 위해 buildspec.yml 파일을 생성합니다.

version: 0.2

env:
  variables:
    SPRING_PROFILE: "prod"

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin AWS_계정_ID.dkr.ecr.ap-northeast-2.amazonaws.com
      - REPOSITORY_URI=AWS_계정_ID.dkr.ecr.ap-northeast-2.amazonaws.com/리포지토리명
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - chmod +x ./gradlew
      - echo unit testing ...
      - SPRING_PROFILES_ACTIVE=${SPRING_PROFILE} ./gradlew test
      - echo make jar ...
      - ./gradlew assemble
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -f Dockerfile -t $REPOSITORY_URI:latest --build-arg JAR_FILE=build/libs/JAR_파일명.jar .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"리포지토리명","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
      - cat imagedefinitions.json
cache:
  paths:
    - '/root/.gradle/**/*'

artifacts:
  files: imagedefinitions.json

 

4. 소스 올리기

SpringBoot 프로젝트 소스를 git을 사용하여 CodeCommit으로 push합니다. (꼭 CodeCommit 리포지토리를 사용할 필요는 없습니다.)

 

5. ECR 리포지토리 생성

AWS Management Console로 접속하여 ECS를 검색하면 Amazon ECR 메뉴를 찾을 수 있습니다. 여기서 "리포지토리 생성" 버튼을 클릭하여 도커 이미지를 저장할 리포지토리를 생성합니다.

 

 

6. CodeBuild 프로젝트 생성 및 실행

이제 CodeBuild를 통해 프로젝트를 빌드하고 ECR 리포지토리로 도커 이미지를 push 합니다. 

 

 

빌드 프로젝트 생성 후 CodeBuild에서 ECR에 접근하여 도커이미지를 올릴 수 있도록 정책을 추가해줍니다. IAM으로 이동하여 CodeBuild 생성 시 같이 생성된(또는 기존에 사용하던) 역할을 찾아 아래와 같은 AmazonEC2ContainerRegistryFullAccess 정책을 추가해줍니다.

 

 

이렇게 하고 나서 아래와 같이 CodeBuild 프로젝트에서 "빌드 시작"을 클릭하게 되면 빌드가 완료되면서 ECR 리포지토리에 이미지가 추가된 것을 확인할 수 있습니다.

 

 

구성하려고 하는 전체 아키텍처에서 지금 구성된 부분은 아래 그림에서 빨간 사각형 부분입니다... (갈 길이 머네요...ㅎㅎ)

 

 

참고

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함