SpringBoot3でDocker利用
SpringBoot3+mysqlでDockerを利用して、どこでも同じ環境を作れるようにしました。
こちらを参考にしています。
Spring-Boot + MySQL + MyBatisを dockerで実行する
以下にソースコードを作成しています。
mybatisDemoForSpringboot3
Dockerfile作成
Dockerfileは以下の通りです。
FROM gradle:7.5.1-jdk18-alpine AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle clean build --no-daemon
FROM openjdk:18-jdk-slim
EXPOSE 8080
RUN mkdir /app
COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar
ENTRYPOINT ["java","-jar","/app/spring-boot-application.jar"]
今回はGradleなのでgradle:7.5.1-jdk18-alpine
を利用しています。
また、このままだと/gradle/src/build/libs/
にjarファイルが2ファイル(xx.jar
とxx-plain.jar
)できるため、build.gradle
に以下を追加します。
jar {
enabled = false
}
じゃないと
COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar
がうまくいきません。
docker-compose.yaml作成
docker-compose.yamlは以下の通りです。
version: "3"
services:
# MySQLのサービス
db:
image: mysql:8
container_name: "spring_db"
ports:
- "3306:3306"
volumes:
- ./mysql/sql/:/docker-entrypoint-initdb.d
- ./mysql/settings/:/var/lib/mysql
- ./mysql/sql/mysql.cnf:/etc/mysql/conf.d/my.cnf
environment:
MYSQL_DATABASE: "demo"
MYSQL_USER: "demo"
MYSQL_PASSWORD: "demo"
MYSQL_ROOT_USER: "root"
MYSQL_ROOT_PASSWORD: "root"
TZ: "Asia/Tokyo"
# springアプリケーションのサービス
spring:
build: ./
container_name: "spring"
restart: always
ports:
- "9090:8080"
tty: true
depends_on:
- db
volumes:
- ./my-workbook:/srv:cached
working_dir: /srv
environment:
DATASOURCE_URL: "jdbc:mysql://db:3306/demo"
動作させるには他に、 my.cnfとinit.sqlが必要になります。
my.cnfは以下の通りです。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
init.sqlは以下の通りです。このファイルに必要テーブルやレコードのSQLを登録します。
CREATE TABLE IF NOT EXISTS customer (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name TEXT,
post TEXT,
address TEXT,
PRIMARY KEY(id)
);
INSERT INTO customer(name, post, address) VALUES('name', 'post', 'address');
docker-composeの実行
以下のコマンド実行できます。
docker-compose up -d
停止するときは以下です。
docker-compose stop
今後の改善点
多分ですが、再実行などするとDockerfileの以下の部分で、 Mysqlのデータもコピーしてしまう気がするので、必要なものだけをコピーする必要があります。
COPY --chown=gradle:gradle . /home/gradle/src
今後改善していこうかと。
まとめ
docker-composeを利用して、どこでも環境構築できるようにしてみました。 参考にしてください。
作成日:2022-08-17 更新日:2022-08-17