gpt4 book ai didi

mysql - docker commit mysql 不保存

转载 作者:行者123 更新时间:2023-12-02 19:10:52 75 4
gpt4 key购买 nike

我正在尝试从 mysql 容器创建一个 docker 镜像。
问题是新图像的数据库是干净的,但是
我手动创建的文件/文件夹
在提交之前的原始容器中,被复制。

基础 mysql 镜像是官方 5.6

docker 是1.11。

我检查了那个文件夹
/var/lib/mysql/d1 在创建数据库但新图像时出现
不保留此文件夹,但保留/root 中的文件夹。

最佳答案

这里发生了几件事:

一、docker commit是代码气味。它往往被那些通过手动过程创建图像的人使用,而不是使用 Dockerfile 自动构建它们,以便于重新创建。如果可能的话,我建议您转换到 Dockerfile 来创建镜像。

接下来,一个 docker commit不会捕获对卷所做的更改。 如果您尝试使用 RUN 更新卷,则会出现同样的问题。进入 Dockerfile。这两个都捕获容器文件系统的更改并将这些更改作为一个层存储在 docker 镜像中,并且卷不是容器文件系统的一部分。如果您运行 docker diff,这也是可见的。对着一个容器。在这种情况下,上游镜像已经在他们的 Dockerfile 中定义了卷:

VOLUME /var/lib/mysql

并且 docker 没有命令从 Dockerfile 撤消创建的卷。您需要直接从 docker 外部修改镜像定义(不推荐)或构建您自己的上游镜像并删除该步骤(推荐)。

mysql 镜像确实提供了在 /docker-entrypoint-initdb.d 中注入(inject)您自己的数据库创建脚本的能力。 ,您可以将其添加到您自己的扩展 mysql 的镜像中,或者作为卷安装。这是您将注入(inject)您的架构或从已知备份进行初始化以进行开发的地方。

最后,如果目标是持久化,您应该将数据存储在一个卷中,而不是通过提交容器:
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

该卷允许您重新创建容器,在发布补丁(例如安全修复)时升级到更新版本的 mysql,而不会丢失您的数据。

要备份卷,这将导出到 tgz:
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz

为了恢复一个卷,这会从 tgz 创建一个:
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz

关于mysql - docker commit mysql 不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37947863/

75 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com