へっぽこITエンジニア@名古屋のブログ

Follow me on GitHub

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.jarxx-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