Cloud Computing & MSA

Spring Boot 애플리케이션 Docker 이미지 빌드하기

ssnowball·2020년 1월 28일·조회 40,059

1. 개요

Spring Boot 애플리케이션을 Docker 이미지로 배포하는 방법을

maven 플러그인을 사용하는 법과 docker build 명령어를 사용하는 법으로 나누어 설명한다.

2. Maven 플러그인 사용

1) Dockerfile 작성

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD RestAPI-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

 

2) pom.xml 수정

  • spotify에서 제공하는 docker client 플러그인을 추가한다.
...
<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>1.0.0</version>
  <configuration>
    <imageName>devopsmgmt/rest-api</imageName>
    <dockerDirectory>src/main/docker</dockerDirectory>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>
...
  • imageName: 도커 이미지 이름을 기재함.
  • dockerDirectory: Dockerfile이 있는 위치를 기재함.

3. docker build 

1) maven 빌드

bash-4.2$ mvn clean package
 

2) Dockerfile 작성

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/RestAPI-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • jar 파일 위치를 Dockerfile 위치 기준으로 알맞게 지정해야 함.

3) docker 이미지 빌드 

bash-4.2$ docker build -t rest-api-test .
Sending build context to Docker daemon 44.51 MB
Step 1/4 : FROM openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/4 : VOLUME /tmp
 ---> Using cache
 ---> f00f5d59ca15
Step 3/4 : ADD target/RestAPI-0.0.1-SNAPSHOT.jar app.jar
 ---> 2d94f3672a37
Removing intermediate container 6212bf6ebc44
Step 4/4 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
 ---> Running in 0d339e37d49a
 ---> 2cd7d4dde0eb
Removing intermediate container 0d339e37d49a
Successfully built 2cd7d4dde0eb

4. 빌드 시 유의사항

root가 아닌 유저로 빌드할 경우, 다음과 같은 에러가 발생할 수 있다.

[maven 플러그인 사용할 경우]

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project RestAPI: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: Permission denied -> [Help 1]
 
[docker build 명령 사용할 경우]
bash-4.2$ docker build -t rest-api-build .
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/build?buildargs=%7B%7D&buildbinds=null&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=rest-api-build&ulimits=null: dial unix /var/run/docker.sock: connect: permission denied
 
해결을 위해서는 다음 두가지 방법을 참고한다.
 
1) 사용중인 유저를 docker 그룹에 추가
bash-4.2$ usermod -aG docker <user> 
bash-4.2$ systemctl restart docker
 
2) docker.sock의 권한 변경
bash-4.2$ cd /var/run
bash-4.2$ ls -al docker.sock
srw-rw----   1 root root              0 Jan 28 18:14 docker.sock
bash-4.2$ chmod 666 docker.sock
bash-4.2$ ls -al docker.sock
srw-rw-rw-   1 root root              0 Jan 28 18:14 docker.sock

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.