SERVER/DOCKER 도커

[도커] spring boot + gradle 배포 정리.

벨포트조던 2019. 1. 18.
반응형

설치 과정은 대충 이전에 썼엇음.

https://wfreud.tistory.com/273


도커를 다 설치하면 우선, 돌아가는지 보자.

Kitematic 이나, 콘솔(파워쉘) 에서 

gs-spring-boot-docker

이거를 docker run 해보자.  Kitematic 에서는 버튼 클릭으로만해도 돌아가니 쉽다.


https://github.com/spring-guides/gs-spring-boot-docker

https://spring.io/blog/2018/11/08/spring-boot-in-a-container


이 두개가 저 예제의 공식 문서이다.


github에 소스를 최대한 비슷하게 해서 하면 로컬에서 돌아갈것이다. 


저기 설명을 대충 말하자면,... 해본사람만 이해하겟지만.. 


기본 샘플은

gradle 설정파일과 dockerfile을 만든후, 로컬에서 jar 파일을 생성 --> docker run을 하여 image 생성하면 로컬의 jar 파일을 docker 에 복사

--> 도커 내부에 복사된 jar 파일을 실행하여 springboot 프로젝트 실행 (서버 가동)




내가 헤맨 부분은 git에서 build.gradle 설정을 통해 (4가지)


The configuration specifies 4 things:

  • a task to unpack the fat jar file

  • the image name (or tag) is set up from the jar file properties, which will end up here as springio/gs-spring-boot-docker

  • the location of the unpacked jarfile, which we could have hard coded in the Dockerfile

  • a build argument for docker pointing to the jar file

이런 과정을 해주는 부분에서 엄청 골아팟다.
이 설정을 하면, gradlew build docker 로 실행 할 수 있다.
그러면 jar 생성되고, jar를 바로 풀어주는거 까지 가능하다. --> 결과적으로 jar 가 아닌 빌드 된 상태이다.

여기서문제 발생. ( 아직 엄청 확실한 건 아니지만 )

예를들어 gradlew build docker 을 로컬에서 치고, 서버를 올리면 좋은 기능이다. ( jar를 올려서 서버에서 실행하는것과 다름 )
로컬에서 jar를 생성 후(빌드 후) 풀고, 풀어둔 파일( boot-inf , class 파일 등 ) 을 한개씩 옴겨주는 방법 
---- 이 방법을 문서에서는 a better dockerfile로 보더라.

그러나, 나는 적용하기 힘들었다. 내 환경은 " git을 사용해 소스 올리고, 쿠버네티스와 콩으로 자동 배포되는 환경 " 이다.
말하자면, git 서버 내부에서 "docker build -t ~~~~~" 를 해야 하는데,   gradlew build docker   이 명령어를 docker build 하기 전에 해줘야 한다. 그럴려면 git 서버에 java 가 있어야 한다. 

그렇게되면 의존적이기 때문에 dockerfile 내부에서  gradlew build docker 를 하기로 했는데, 이렇게 되면 문제가 많다... 
[문제]
gradlew build docker 라는게 gradle에서 설정한 파일을 바탕으로 라이브러리 및 디펜던시를 사용하여 해준는 과정인데, 
git 에 올라간 파일들은 소스파일밖에 없음. 그래서 gradlew build "docker" 이 docker 부분을 읽지 못함. 이 docker를 읽지 못하면 unpack 못하고 copy 못하고 등등 애초에 할 수가 없음. .. 
(확실하진 않지만 오류를 계속 보고 내린 결론 )

- 여러가지 문제가 있지만 핵심은 소스만 가지고 저 명령어를 칠 수 없다. gradlew build docker 이걸 사용못하면 unpack 도 안되고 그렇다.

- 해결하기 위해, 문서에 Multi-Stage Build  를 사용햇다. 여기서도 gradlew build docker 이거 사용할라고 별짓을 다해봤지만 지금 생각해보니 될수 가없는 것 같다.  ( java 파일만 가지고 할 수있는건 gradlew (wrapper) 밖에 못하네 ..)
- 해결방법은 multi-stage build 밖에 없어보임 .
- 맨위 문서에 방법이 나와있는데, 약간 다르다.

- 소스에는 대부분 maven 밖에 없어서 힘들게 햇다.

[dockerfile]
FROM openjdk:8-jdk-alpine as builder

COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle . 
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootjar

FROM openjdk:8-jdk-alpine
COPY --from=builder build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

이런식으로 

소스랑 빌드할 실행프로그램 copy -> bootjar 파일 생성 후 -> 다른 도커image에 복사 -> 복사한거 실행
이런 순으로 실행됨 



아 .. 그리고 추가로 

ADD failed: stat /var/lib/docker/tmp/docker-builderXXXXXX: no such file or directory


이런식의 에러가 나올수 잇다.

검색하면 무슨 .dockerignore에서 못하게 막는다라고도 설명이 많은데, 이건 진짜 파일이나 디렉토리를 찾을 수 없을 수 있음.


---------------------------------------------------------------------------------------------------------------------------------------------------------
참고한 url 

위 두개
https://aboullaite.me/multi-stage-docker-java/
http://paulbakker.io/java/docker-gradle-multistage/
 
https://dzone.com/articles/a-dockerfile-for-maven-based-github-projects

https://docs.docker.com/develop/develop-images/multistage-build/


https://spring.io/blog/2018/11/08/spring-boot-in-a-container


반응형

댓글