【問題解決】容器部署MySQL的數據在docker commit導出的鏡像中丟失

問題起因

最近公司有個甲方項目參加競賽,要求在(基於kubeflow/arena)平臺上部置應用,可以將MySQL打包在應用一起,也可以分開部署,沒有提供volume相關的支持。大意是可以把初始好的數據直接拿到平臺上。

經過本人在Linux虛機中啓動MySQL容器導入數據再 docker commit 出鏡像部署到平臺上,發現數據竟然沒了,包括新導的庫。。。

問題排查經過

經過docker inspect發現一個不尋常的點,一直沒關注過的情況。可以注意到ContainerConfig下Volumes掛了個{}

docker inspect mysql:5.7.17 -f "{{json .ContainerConfig.Volumes}}"
{"/var/lib/mysql":{}}

這是什麼意思呢?

意思是說在容器啓動後,自動分配一塊Volume掛載到容器中/var/lib/mysql掛載點上。

也就是說Volume不會在docker commit時保存到鏡像中。

經過查看官方倉庫中發現了在Dockerfile中使用了VOLUME這個命令。

問題解決

問題原因找到了,把數據目錄變更成其他目錄不就可以實現MySQL+數據合到一個鏡像中了嘛!

這裏以手頭的mysql:5.7.17版本的官方MySQL鏡像舉例,其他版本的配置文件不一定和本例中位置相同,一般配置文件處於/etc/my.cnf、/etc/mysql/下。

主要的修改數據目錄和遷移數據的命令:

# 進入mysql容器
docker exec -it mysql bash
# 修改數據目錄到/data/mysql,版本不同位置可能不同
sed -i "s#datadir.*/var/lib/mysql#datadir=/data/mysql#g" /etc/mysql/mysql.conf.d/mysqld.cnf
# 遷移數據目錄
mkdir /data
cp -r /var/lib/mysql /data/
chown mysql:mysql /data -R
# 退出容器,重啓容器使用新數據目錄
exit
docker restart mysql
# 容器啓動後,導入數據(省略步驟)
# 關閉myql容器以保存正常關閉狀態
docker stop mysql
# 導出含數據的鏡像
docker commit mysql mysql:v1

總結

簡單記錄一下導出帶數據的MySQL鏡像方式,踩到了Dockerfile的VOLUME指令的坑,簡單分析了下該命令的作用。文中鏡像帶數據這只是爲了臨時使用,幾乎不變更數據情況下使用,容器重啓會導到增量數據丟失。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章