IT/DevOps

[Devops] Springboot 프로젝트 Docker이미지 만들기(Dockerizing)

반응형

intro

Springboot 프로젝트를 가져와서 도커이미지를 만들기위해 Jib plugin을 사용하여 skaffold를 통해 build및 dockerizing, docker push를 해보도록 하겠습니다.

React샘플 프로젝트

github에서 Springboot기반 resfulapi프로젝트 샘플을 찾던 중에 터키에 있는 외국친구의 샘플을 가져와 사용하였다.
이분이 정말 친절한게 샘플코드에 이해가 안되는 부분이 있어서 혹시나해서 메일을 보냈는데 엄청 친절하게 알려주심 (Dursun ERYILMAZ님 다시한번 감사합니다.)
https://github.com/dursuneryilmaz/Simple-Employee-Management-Tool/tree/master/EmpManagementBackend

jib이란?

Jib 는 Docker 데몬없이 Java 애플리케이션에 최적화 된 OCI 호환 컨테이너 이미지를 빌드하기위한 maven 및 gradle 용 플러그인 세트입니다.

skaffold란?

Skaffold는 Jib을 동작시킬 수 있는 명령 도구이며, Jib은 컨테이너 이미지를 빌드한 다음 원격 레지스트리로 푸시합니다.

java springboot pom.xml

jib을 사용하기위해 pom.xml에 아래와 같이 프로젝트 <project></project>안에 아래 부분을 추가합니다.
아래 코드에서 profiles를 구분한 이유는 개발,운영,스테이징 환경 별로 다른 변수값을 지정할 수 있도록 하기 위함 입니다.

    <!-- Common properties -->
    <properties>
        <java.version>11</java.version>
        <jib.maven-plugin-version>1.6.1</jib.maven-plugin-version>
        <time-zone>Asia/Seoul</time-zone>
        <!-- Docker image Digest -->
        <digest>sha256:0000f949e6f7d28d4ffcc574e3b0ce1f4810aca2c72769de5ce7d6e9ffbe0000</digest>
    </properties>

    <profiles>
        <profile>
            <id>local</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>

        <profile>
            <id>prod</id>
            <!-- prod properties -->
            <properties>
                <!-- AWS account ID -->
                <account>058475846659</account>
                <!-- AWS ECR Name -->
                <ecr-image>backend-base</ecr-image>
            </properties>
        </profile>

    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>${jib.maven-plugin-version}</version>
                <configuration>
                    <to>
                        <credHelper>ecr-login</credHelper>
                    </to>
                    <from>
                        <!-- Docker image URL -->
                        <image>${account}.dkr.ecr.ap-northeast-2.amazonaws.com/${ecr-image}@${digest}</image>
                    </from>
                    <container>
                        <jvmFlags>
                            <jvmFlag>-Djava.security.egd=file:/dev/./urandom</jvmFlag>
                        </jvmFlags>
                    </container>
                </configuration>
            </plugin>
        </plugins>
    </build>

skaffold.yaml

아래 SPRING_PROFILES_ACTIVE=prod 부분이 pom.xml에서 환경별(개발,운영,스테이징)로 설정한 profiles의 변수를 다르게 가져가도록 설정하는 부분입니다.
아래 template: "{{.VER}}" 부분은 docker image의 tagging 설정이며 OS의 환경변수로 설정해야합니다. 예를들어 리눅스에서 환경변서 VER=v1으로 설정하면 도커라이징이될 docker image는 다음과 같이 태깅이 됩니다. '000000000000.dkr.ecr.ap-northeast-2.amazonaws.com/backend-emp:v1'

참고 URL: https://skaffold.dev/docs/environment/templating/

apiVersion: skaffold/v2alpha4
kind: Config


profiles:
  - name: prod
    build:
      tagPolicy:
        envTemplate:
          template: "{{.VER}}"
      artifacts:
        # base docker image url
        - image: 000000000000.dkr.ecr.ap-northeast-2.amazonaws.com/backend-emp
          jib:
            args:
              - -B
              - -U
              - -DskipTests
              - "-Djib.container.environment=SPRING_PROFILES_ACTIVE=prod"
              - -Pprod

skaffold 실행하기

"VER=v1 skaffold build -p prod --cache-artifacts=false"
반응형