【问题解决】容器部署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指令的坑,简单分析了下该命令的作用。文中镜像带数据这只是为了临时使用,几乎不变更数据情况下使用,容器重启会导到增量数据丢失。
【问题解决】容器部署MySQL的数据在docker commit导出的镜像中丢失的更多相关文章
- Docker容器部署Mysql数据库服务器
本节会用到的Docker命令如下: docker images 查看mysql镜像id docker run -d -p xxxxxxxxxxxxxxx/zhufc/mysql:v2 通过镜像生成 启 ...
- Docker commit 制作weblogic镜像
第一:前提条件 1.本机必须已经安装了docker 容器 2.pull 一个基础的镜像 如图:rastasheep/ubuntu-sshd 第二:利用docker commit 命令 将容器的状态 ...
- docker commit理解构建镜像(7)
镜像是多层存储,每一层是在前一层的基础上进行的修改: 而容器同样也是多层存储是在以镜像为基础层,在基础层上加一层作为容器运行时的存储层. 当我们使用Docker Hub的镜像无法满足我们的需求时,我们 ...
- docker怎么导出导入镜像
https://blog.csdn.net/dest_dest/article/details/80612231 把某个docker镜像保存到本地文件,命令如下docker save -o 镜像名.t ...
- docker stack 部署 mysql 5.6
=============================================== 2018/7/1_第1次修改 ccb_warlock === ...
- Docker 部署mysql
目录 Docker 部署mysql 步骤 1.查找 Docker Hub 上的 MySQL 镜像 2.docker pull mysql 拉取镜像 3.运行容器 4.查看容器启动情况 使用命令备注 D ...
- 通过 Docker 部署 Mysql 8.0 主从模式
文章转载自:http://www.mydlq.club/article/106/ 系统环境: Mysql 版本:8.0.23 Docker 版本:19.03.13 一.为什么需要 Mysql 主从复制 ...
- docker部署mysql Navicat远程连接
docker部署mysql Navicat远程连接 docker search mysql 查看mysql镜像(是去dockerHub网站搜素镜像,遇到问题可以去该网站查看官方文档,纯英文文档估计 ...
- Docker容器学习梳理 - Volume数据卷使用
之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...
- Docker学习笔记:镜像、容器、数据卷
核心概念 镜像:一个只读的模板,类似虚拟机的镜像. 容器:可以理解为镜像的一个运行实例.运行时类似于沙箱,多个容器互相独立. 仓库:存放镜像文件的地方. 镜像 命令表格 命令 解释 选项 docker ...
随机推荐
- 从GFS到GPT,AI Infra的激荡20年
导读 最近AIGC和LLM的浪潮层层迭起,大有把AI行业过去十年画的饼,一夜之间完全变现的势头.而 AI Infra (构建AI所需的基础设施),也成了讨论的焦点之一.大众对AI Infra的关注点 ...
- Github疯传!谷歌师兄的LeetCode刷题笔记开源了!
有小伙伴私聊我说刚开始刷LeetCode的时候,感到很吃力,刷题效率很低.我以前刷题的时候也遇到这个问题,直到后来看到这个谷歌师兄总结的刷题笔记,发现LeetCode刷题都是套路呀,掌握这些套路之后, ...
- vue模拟el-table演示插槽用法
vue模拟el-table演示插槽用法 很多人知道插槽分为三种,但是实际到elementui当中为什么这么用,就一脸懵逼,接下来就跟大家聊一聊插槽在elementui中的应用,并且自己写一个类似el- ...
- ReactNative原理与核心知识点
React Native特点 跨平台 使用js写出页面组件代码被React框架统一转成Virtual DOM树,Virtual DOM树是UI结构的一层抽象,可以被转换成任何支持端的UI视图. Rea ...
- k8s部署springboot
综述 首先介绍发布步骤. 1.从代码仓库下载代码,比如GitLab: 2.接着是进行打包,比如使用Maven: 3.编写Dockerfile文件,把步骤2产生的包制作成镜像: 4.上传步骤3的镜像到远 ...
- Unity中的InitializeOnLoad特性:深入解析与实践
Unity中的InitializeOnLoad特性:深入解析与实践 在Unity开发过程中,我们经常需要在编辑器启动时或脚本重新编译后执行一些操作,例如初始化数据.注册事件等.这时,我们可以使用Ini ...
- LeetCode 周赛(2023/07/08)渐入佳境
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 351 场 · 一场关于子数 ...
- 高通个别驱动创建Buffer耗时高问题的解决
前言 最近在优化游戏的时候,发现在在高通特定驱动版本的机器上(855,855+等),创建VB的耗时跟VB的数量成正比,这个应该是驱动的bug.跟官方人员确认过,确实是有这个问题,他们给的解决方案是减少 ...
- 嵌入式低功耗WiFi设备保活功耗分析
(一)嵌入式低功耗设备介绍 在物联网(IoT)领域,设备可以使用以太网和无线网进行网络连接. 以太网: 网络稳定,带宽高,延迟低,但是以太网需要拉网布线,设备安装邻活便利性能差. 无线网络:安装位置灵 ...
- 2023-07-15:给你一个 非递减 的正整数数组 nums 和整数 K, 判断该数组是否可以被分成一个或几个 长度至少 为 K 的 不相交的递增子序列。 输入:nums = [1,2,2,3,3,
2023-07-15:给你一个 非递减 的正整数数组 nums 和整数 K, 判断该数组是否可以被分成一个或几个 长度至少 为 K 的 不相交的递增子序列. 输入:nums = [1,2,2,3,3, ...