- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
最近公司有个甲方项目参加竞赛,要求在(基于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指令的坑,简单分析了下该命令的作用。文中镜像带数据这只是为了临时使用,几乎不变更数据情况下使用,容器重启会导到增量数据丢失.
最后此篇关于【问题解决】容器部署MySQL的数据在dockercommit导出的镜像中丢失的文章就讲到这里了,如果你想了解更多关于【问题解决】容器部署MySQL的数据在dockercommit导出的镜像中丢失的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!