問題起因
最近公司有個甲方項目參加競賽,要求在(基於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指令的坑,簡單分析了下該命令的作用。文中鏡像帶數據這只是爲了臨時使用,幾乎不變更數據情況下使用,容器重啓會導到增量數據丟失。