Docker容器啟動(dòng)時(shí)初始化Mysql數(shù)據(jù)庫(kù)的方法

1. 前言
Docker在開發(fā)中使用的越來(lái)越多了,最近搞了一個(gè)Spring Boot應(yīng)用,為了方便部署將Mysql也放在Docker中運(yùn)行。那么怎么初始化 SQL腳本以及數(shù)據(jù)呢?
我這里有兩個(gè)傳統(tǒng)方案。 第一種方案是在容器啟動(dòng)后手動(dòng)導(dǎo)入,太low了不行。第二種在Spring Boot客戶端連接Mysql容器時(shí)初始化數(shù)據(jù)庫(kù),你可以參考使用flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制一文,但是這依賴客戶端的能力。能不能做到Mysql容器啟動(dòng)時(shí)就自己初始化數(shù)據(jù)庫(kù)呢?當(dāng)然可以!今天就來(lái)演示一下。全部代碼見(jiàn)文末。
2.原理
當(dāng)Mysql容器首次啟動(dòng)時(shí),會(huì)在 /docker-entrypoint-initdb.d目錄下掃描 .sh,.sql,.sql.gz類型的文件。如果這些類型的文件存在,將執(zhí)行它們來(lái)初始化一個(gè)數(shù)據(jù)庫(kù)。這些文件會(huì)按照字母的順序執(zhí)行。默認(rèn)情況下它們會(huì)初始化在啟動(dòng)容器時(shí)聲明的 MYSQL_DATABASE變量定義的數(shù)據(jù)庫(kù)中,例如下面的命令會(huì)初始化一個(gè)REGION_DB 數(shù)據(jù)庫(kù):
$ docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag
如果你的啟動(dòng)命令沒(méi)有指定數(shù)據(jù)庫(kù)那么就必須在數(shù)據(jù)庫(kù)DDL腳本中聲明并指定使用該數(shù)據(jù)庫(kù)。否則就會(huì)實(shí)現(xiàn)下面的異常:
ERROR 1046 (3D000) at line 7: No database selected
那么接下來(lái)我們將利用這一機(jī)制來(lái)實(shí)現(xiàn)Docker容器啟動(dòng)時(shí)初始化數(shù)據(jù)庫(kù)。
3.自定義Dockerfile
我們編寫自己的Dockerfile來(lái)實(shí)現(xiàn)我們的需求,這里以 Mysql:5.7 為例。不同的版本可能有一定的出入,需要詳細(xì)去閱讀官方文檔。腳本如下:
FROM mysql:5.7 LABEL OG=felord.cn COPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnf COPY ./sql /tmp/sql RUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.d RUN rm -rf /tmp/sql
- 第一步,引入官方 Mysql:5.7 Docker鏡像。
- 第二步,無(wú)實(shí)際意義,主要是作者、組織信息。
- 第三步,很重要!本來(lái)我沒(méi)有配置第三行,結(jié)果運(yùn)行容器后發(fā)現(xiàn)初始化數(shù)據(jù)的中文全部亂碼了。所以需要在初始化數(shù)據(jù)庫(kù)前修改Mysql的編碼等配置,這里我順便把時(shí)區(qū)也改為了
+8:00。第四步,復(fù)制包含數(shù)據(jù)庫(kù)腳本的./sql文件夾到鏡像的/tmp/sql下。 - 第五步,使用
mv命令把第四步拷貝的文件夾下的所有.sql文件復(fù)制到/docker-entrypoint-initdb.d下,這樣才能利用2.章節(jié)的機(jī)制進(jìn)行初始化數(shù)據(jù)庫(kù)。 - 第六步,刪除使用過(guò)的臨時(shí)目錄。
然后你可以通過(guò)構(gòu)建鏡像命令構(gòu)建自定義的Mysql鏡像:
# 一定不要忘記最后的一個(gè) . 點(diǎn)
docker build -t mysql:5.7c .
通過(guò)mysql:5.7c鏡像啟動(dòng)一個(gè)名稱為mysql-service的容器,root密碼為123456,并持久化數(shù)據(jù)到宿主機(jī) D:/mysql/data下:
docker run --name mysql-service -v d:/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7c
小貼士:你可以通過(guò) SHOW VARIABLES LIKE 'character%' 查看字符集是否更改為utf8mb4,也可以通過(guò)SHOW VARIABLES LIKE '%time_zone%' 查看時(shí)區(qū)是否是東八區(qū)。
4. 總結(jié)
到此這篇關(guān)于Docker容器啟動(dòng)時(shí)初始化Mysql數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)docker容器啟動(dòng)初始化數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker 制作鏡像Dockerfile和commit操作
這篇文章主要介紹了Docker 制作鏡像Dockerfile和commit操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
使用docker啟動(dòng)redis守護(hù)進(jìn)程的詳細(xì)流程
在現(xiàn)代軟件開發(fā)中,緩存和消息隊(duì)列是提高應(yīng)用性能和擴(kuò)展性的關(guān)鍵,Redis 是一種流行的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),使用 Docker 容器化技術(shù)可以方便地部署和管理 Redis 服務(wù),本文給大家介紹了使用docker啟動(dòng)redis守護(hù)進(jìn)程的詳細(xì)流程,需要的朋友可以參考下2025-01-01
Ubuntu Docker 的安裝部署及簡(jiǎn)單應(yīng)用
這篇文章主要介紹了Ubuntu Docker 的安裝部署的相關(guān)資料,這里說(shuō)明介紹了詳細(xì)的步驟,需要的朋友可以參考下2016-10-10
Armbian5.9.0安裝docker及部署可視化portainer的詳細(xì)教程
這篇文章主要介紹了Armbian5.9.0安裝docker及部署可視化portainer的詳細(xì)教程,通過(guò)?ssh?進(jìn)去?Armbian?系統(tǒng)后,輸入相應(yīng)代碼,按提示輸入y,等待安裝完成即可,需要的朋友可以參考下2022-05-05
Docker鏡像構(gòu)建原理解析(不裝docker也能構(gòu)建鏡像)
這篇文章主要介紹了Docker鏡像構(gòu)建原理解析(不裝docker也能構(gòu)建鏡像),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
pipework docker無(wú)法使用ip netns命令解決辦法
這篇文章主要介紹了pipework docker無(wú)法使用ip netns命令解決辦法的相關(guān)資料,需要的朋友可以參考下2016-10-10
docker安裝fastdfs鏡像的一些注意事項(xiàng)
在安裝docker fastdfs鏡像時(shí)大家需要注意如果是云服務(wù)器則需要在云服務(wù)器后臺(tái)的安全組入口方向放開22122、23000以及8888端口,并且在云服務(wù)器防火墻配置放開以上三個(gè)端口,具體內(nèi)容詳情大家跟隨小編一起看看吧2021-05-05
解決docker run hello-world遇到錯(cuò)誤消息-error during&n
這篇文章主要介紹了解決docker run hello-world遇到錯(cuò)誤消息-error during conne問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
docker安裝redis 5.0.7并掛載外部配置和數(shù)據(jù)問(wèn)題
Redis 是一個(gè)開源的使用 ANSI C 語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value 的 NoSQL 數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的 API。這篇文章主要介紹了docker安裝redis 5.0.7并掛載外部配置和數(shù)據(jù),需要的朋友可以參考下2019-12-12

