【问题解决】容器部署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指令的坑,简单分析了下该命令的作用。文中镜像带数据这只是为了临时使用,几乎不变更数据情况下使用,容器重启会导到增量数据丢失。
本文作者:东北小狐狸
本文链接:https://www.cnblogs.com/hellxz/p/17653690.html
版权声明:本作品采用自由转载-非商用-非衍生-保持署名 (CC BY-NC-ND 3.0)许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步