docker mysql初始化數據及數據持久化
1.初始化默認數據
原理
當Mysql容器首次啟動時,會在 /docker-entrypoint-initdb.d/目錄下掃描 .sh、.sql、.sql.gz類型的文件。如果這些類型的文件存在,將執行它們來初始化一個數據庫。這些文件會按照字母的順序執行。默認情況下它們會初始化在啟動容器時聲明的 MYSQL_DATABASE變量定義的數據庫中,例如下面的命令會初始化一個REGION_DB 數據庫:
docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag
如果你的啟動命令沒有指定數據庫那么就必須在數據庫DDL腳本中聲明並指定使用該數據庫。否則就會實現下面的異常:
ERROR 1046 (3D000) at line 7: No database selected
操作
我們經常會在mysql容器啟動時,需要初始化一些數據庫、數據表或者其他默認數據。其實mysql早已支持我們這種需求,具體方案如下:
# 其實主要的做法就是重新build mysql鏡像
# 新建Dockerfile
FROM mysql:5.7
COPY sql/*.sql /docker-entrypoint-initdb.d/
# gantt.sql文件
create database `gantt` default character set utf8 collate utf8_general_ci;
# build鏡像(tag需要更新為自己需要鏡像tag)
docker build -t tag .
2.mysql數據持久化
數據持久化主要是將mysql中的數據內容映射到宿主機,從而保證數據的可以永久保存(down - v 后數據依然在),如果需要完全遷移數據,則需要將映射在宿主機的文件一並遷移。docker-compose.yml文件配置如下:
version: '2.3'
services:
schedule-mysql:
image: hub.infervision.com/dev/viewer-collection:schedule-mysql-5.7
restart: always
ports:
- 3311:3306
volumes:
- ./mysql_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=gantt
- MYSQL_PASSWORD=gantt