使用SpringBoot(Gradle)+MySQL8.0+CSV进行初始数据库导入的应用在Windows Docker上运行

用中文表述以上内容,只需一种解答:

目标

    • SpringBootで作ったJavaサーバ、DBはMySQLの8.0を使用する

 

    • サーバー起動時に、data.csvとinit.sqlを用意し、init.sqlからlocal infileコマンドを使用してdata.csvで初期DBをインポート

 

    • 他の人の環境で環境構築が大変なので、Dockerを使用することにした

 

    結構ハマったり苦労したので共有

在Docker中如何执行?

    Dockerは1コンテナで1サービスが基本。JavaサーバコンテナとMySQLコンテナの2つを作り、docker-composeで連携させます

需要设置的整体结构图

image.png

如何()

@Entity をもったクラスファイル

GenerationType.AUTO ではなく、GenerationType.IDENTITY を使用してください
CSVを事前インポートした後に、新しくデータを追加すると同じIDが重複するという問題が発生します

@Entity
@Table(name="shohin")
public class MyData {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = true, unique = true)
    private Integer id;

    • application.yml

上がローカルで回すとき、下がdocker-composeで回すときの設定です
ローカルのurlが長いのは、何かとエラーがでて対策を入れた結果です

server:
  port: 8081

---
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    password: hogehoge
    url: jdbc:mysql://localhost:3306/hogehoge_db?allowPublicKeyRetrieval=true&useSSL=FALSE&characterEncoding=UTF-8&serverTimezone=JST
    username: hoge
  jpa:
    database: MYSQL
    hibernate:
      ddl-auto: update

---
spring:
  profiles: docker-compose
  datasource:
    url: jdbc:mysql://dbserver/hogehoge_db
    username: hoge
    password: hogehoge
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    • my.cnf

MySQL8.0から「load data local infile」コマンドがデフォルトオフになりました。local_infile=1で有効にします
また、Windows Proの環境のDockerならばこのままで問題ありませんが、Home環境だとパーミッション777のファイルはMySQL8.0が読みにいかないので読み取り専用にプロパティから変更しておきます

[Warning] World-writable config file ‘/etc/mysql/conf.d/my.cnf’ is ignored

文字コードも調整しておきます

[mysqld]
character-set-server=utf8
local_infile=1

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8
local_infile=1
    • init.sql

docker-compose up –build コマンドを叩いたとき、1回目に呼ばれるSQLです
IDには「id int AUTO_INCREMENT PRIMARY KEY」を指定してください。 @Entity で指定したカラムにしてください。

use hogehoge_db;
CREATE TABLE shohin(hogehoge);
load data local infile '/docker-entrypoint-initdb.d/data.csv' INTO TABLE sector FIELDS TERMINATED BY ',';
select * from shohin;
    mysql/Dockerfile
FROM mysql:8.0
RUN touch /var/log/mysql/mysqld.log
image.png
FROM openjdk:jdk-alpine
VOLUME /tmp
RUN mkdir /app
WORKDIR /app
ENV JAR_TARGET "hogehoge-0.0.1-SNAPSHOT.jar"
ENTRYPOINT ["sh","-c","java -jar -Dspring.profiles.active=docker-compose ./build/libs/${JAR_TARGET}"]
    • docker-compose.yml

データの永続化をすると、mysqlコンテナにデータが残らなくなり、後々CSVを読み込むとき面倒だったのでコメントアウト
mysqlコンテナを docker rm hogehoge 等で削除しない限りは残りますので安心してください

version: "3"
services:
  dbserver:
    container_name: mysql8.0_hogehoge_db
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: hogehoge_db
      MYSQL_USER: hoge
      MYSQL_PASSWORD: hogehoge
      MYSQL_ROOT_PASSWORD: hogehogehoge
    expose:
      - 3307
    ports:
      - 3307:3307
    volumes:
      # 起動スクリプト
      - ./docker-compose/mysql/initdb:/docker-entrypoint-initdb.d
      # MySQLの設定ファイル
      - ./docker-compose/mysql/config:/etc/mysql/conf.d
      # DBの永続化 アプリコンテナ、DBコンテナを消しても残り続ける。今回はCSVを読みたいのでコメントアウト。コンテナ消すとDB消えるから注意しろな!
      #- mysql_db:/var/lib/mysql
      # logの出力
      - ./log/mysql:/var/log/mysql
  app:
    container_name: hogehoge_app
    build: ./docker-compose/spring
    depends_on:
      - dbserver
    ports:
      - "8081:8081"
    volumes:
      - .:/app
    environment:
      # mysqlの接続設定 host:portはコンテナ名指定
      spring.datasource.driverClassName: "com.mysql.cj.jdbc.Driver"
      spring.datasource.url: "jdbc:mysql://dbserver/hogehoge_db"
      spring.datasource.username: "hoge"
      spring.datasource.password: "hogehoge"
# DBの永続化先
volumes:
  mysql_db:
    driver: local

    • build.gradle

dependenciesにmysqlを追加。以下サンプル

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
    compile 'org.springframework.boot:spring-boot-devtools'
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    runtime('mysql:mysql-connector-java')
}

在进行git分发时

    • /build/libsの中のjarがデフォルトgitignoreに入ってると思いますが、gitで管理してください。このjarを元に回るため

 

    readmeに、mysql\config のmy.cnfを読み取り専用にするように記載してください

准备Docker

    • dockerをインストール済みのWindowsの用意

docker desktopの設定を開き、Resources→File SharingでCドライブを追加する
https://qiita.com/kikako/items/7b6301a140cf37a5b7ac

在docker上运行

    • エクスプローラのファイルよりpowershellを管理者で起動(管理者権限があるユーザなら普通のpowershellでよい)

 

    • docker-compose up –build

その後右下に警告がでたら share it を2回押下。2回でるきがする
Ctrl Cで止められるが、怖いなら docker-compose up –build -d でバックグラウンド実行

down叩くまで動き続ける

終わらせるときは同一フォルダで docker-compose down
1回目はアプリ起動時にSQLが実行されておらず、起動に失敗すると思う。2回目に起動成功します

在第二次导入CSV文件时,删除现有的数据库等。

image.png
    * 全コンテナ停止: docker stop $(docker ps -q)
    * 全コンテナ削除:docker rm $(docker ps -q -a)
    * 全イメージ削除: docker rmi $(docker images -q)