使用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で連携させます
需要设置的整体结构图
如何()
@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
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文件时,删除现有的数据库等。
* 全コンテナ停止: docker stop $(docker ps -q)
* 全コンテナ削除:docker rm $(docker ps -q -a)
* 全イメージ削除: docker rmi $(docker images -q)