Spring Boot를 도커라이즈 했던 과정이 결코 쉽지는 않았어서, 기록으로 좀 남겨두고자 한다.
1. 빌드 파일(jar) 생성
gradle > Tasks > build > bootJar 클릭
2. 프로젝트 최상단 위치에 Dockerfile과 docker-compose.yml 작성
Dockfile
FROM openjdk:8
ARG JAR_FILE=build/libs/ssafe-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
JAR_FILE에는 jar파일의 경로를 넣어준다.
docker-compose.yml
version: "3"
services:
database:
image: mysql
container_name: "ssafe_db"
environment:
MYSQL_DATABASE: moramoram
MYSQL_USER: moramoram
MYSQL_PASSWORD: moramoram
MYSQL_ROOT_PASSWORD: moramoram
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
volumes:
- ./db/data:/var/lib/mysql:rw
- ./db/setup:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
application:
build: .
container_name: "ssafe_app"
ports:
- "8080:8080"
depends_on:
- database
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://database:3306/moramoram?Timezone=UTC&characterEncoding=UTF-8
SPRING_DATASOURCE_USERNAME: moramoram
SPRING_DATASOURCE_PASSWORD: moramoram
mysql을 docker-compose를 통해 새로 생성하여 사용할 것이기 때문에, database의 environment 설정들은 앞으로 사용할 정보로 채워넣으면 된다.
또한, application에서 build : . 로 되어있는데, 이는 . 위치에 있는 Dockerfile을 찾아 이미지를 빌드할 거란 의미이므로, Dockerfile 생성 후 image를 생성하는 docker run 명령어를 입력하지 않아도 된다. docker-compose up으로 db와 app image 한 번에 다 된다.
- 기억할 것 1
application의 environment에서 DATASOURCE 관련 정보는, 앞에서 database에 입력한 정보와 동일하게 입력해야 한다.
이 database를 사용해서 빌드할 거니까, 당연한 원리이다.
처음에 docker-compose.yml - environment - datasource url이 localhost:3306로 되어 있었는데, docker의 mysql을 쓸 것이므로 database:3306으로 바꿔야 한다.
- 기억할 것 2
database : volumns에
- ./db/setup:/docker-entrypoint-initdb.d
이걸 추가하지 않아서 docker compose를 실행해도 error가 났었다.
error내용은 db connection은 되는데 table이 없다는 에러였고, 현재 database에는 app과 맞는 스키마와 테이블이 하나도 형성되어 있지 않아서 발생하는 에러였다.
따라서, ./db/setup 폴더를 형성해 주고, setup.sql을 생성한 다음 원래 spring boot에서 쓰던 sql dump 파일을 넣어준다.
docker compose가 실행되며 컨테이너에서 가장 처음 실행되는 것이 docker-entrypoint인데, 이게 initdb.d를 실행하며 이 dump 파일과 mount되기 때문에 제대로 connection이 동작하게 된다.
-기억할 것 3
application.yml에 datasource 정보는
로컬로 실행하려면 url을 localhost로, username과 password는 로컬 db의 정보를 넣어줘야 한다.
그런데 docker로 실행하려면 당연히 url, username, password는 모두 docker-compose.yml에 맞게 바꿔서 실행해야 제대로 실행된다!!
+)
위 파일 작성 시 주로 참고한 사이트 :
3. cli에서 해당 프로젝트 위치로 이동 후, docker-compose up 명령어 실행
- 설정 파일(docker-compose.yml)에만 변경이 있는 경우 :
docker-compose down
docker-compose up
이것만 해 주면 업데이트 되어서 다시 실행됨.
- yml말고 다른 소스코드들이 변경되면, 이미지를 다시 빌드해서 실행
docker-compose down
docker build .
docker-compose up
이미지 없애고 다시 compose up 해줌
'프로젝트 기록' 카테고리의 다른 글
JPA 쿼리 최적화 기록 (0) | 2022.02.23 |
---|---|
MySql 시간 설정 삽질 기록 + 기타 기록 (0) | 2022.02.23 |
MobaXterm을 통한 배포 기록 (0) | 2022.02.23 |
JPA Paging 삽질 기록 (0) | 2022.02.23 |
Entity type으로 Wrapper class를 사용하는 이유 (0) | 2022.02.23 |