如何正确推送携带已有数据库的MySQL Docker镜像至Docker Hub
问题根本原因
官方MySQL镜像的Dockerfile中默认将/var/lib/mysql(MySQL默认数据存储目录)声明为匿名卷。你在运行中的容器内写入的所有数据库数据,实际存储在宿主机的匿名卷中,不会被包含在docker commit生成的镜像层内,因此推送到Docker Hub的镜像天然不包含你创建的自定义数据库。
正确打包方案
推荐使用Dockerfile + 初始化SQL的方式构建镜像,符合Docker最佳实践,兼容性最高:
- 第一步:导出已有数据库的SQL备份
在宿主机执行以下命令,从当前运行的MySQL容器中导出你创建的两个数据库数据,替换命令中的占位符为你自己的配置:docker exec [你的MySQL容器名/ID] mysqldump -u[数据库用户名] -p[数据库密码] --databases [第一个数据库名] [第二个数据库名] > init.sql - 第二步:编写Dockerfile
在init.sql所在目录新建名为Dockerfile的文件,内容如下:
官方MySQL镜像内置逻辑:首次启动容器时会自动执行# 替换为你实际使用的MySQL基础镜像版本,避免版本差异导致兼容性问题 FROM mysql:8.0 COPY init.sql /docker-entrypoint-initdb.d//docker-entrypoint-initdb.d目录下的所有.sql后缀文件,自动完成数据库创建和数据导入。 - 第三步:构建自定义镜像
执行构建命令,替换占位符为你的Docker Hub账号信息和镜像配置:docker build -t [你的Docker Hub用户名]/[自定义镜像名]:[版本标签] . - 第四步:推送镜像到Docker Hub
先执行docker login输入你的Docker Hub账号密码完成登录,再执行推送命令:docker push [你的Docker Hub用户名]/[自定义镜像名]:[版本标签]
镜像使用说明
其他设备拉取该镜像后正常启动即可,首次启动会自动执行初始化脚本生成你需要的两个数据库。如果需要持久化后续写入的数据,启动时可以挂载本地卷到容器的/var/lib/mysql路径,已经初始化过的卷不会重复执行初始化脚本。
内容的提问来源于stack exchange,提问作者Nada Albargawi
相关产品推荐
相关产品推荐

