설치 과정은 대충 이전에 썼엇음.
https://wfreud.tistory.com/273
도커를 다 설치하면 우선, 돌아가는지 보자.
Kitematic 이나, 콘솔(파워쉘) 에서
이거를 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에 복사 -> 복사한거 실행
이런 순으로 실행됨
아 .. 그리고 추가로
이런식의 에러가 나올수 잇다.
검색하면 무슨 .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
댓글