【问题标题】:docker container / image not saving changesdocker容器/图像不保存更改
【发布时间】:2023-03-23 05:18:01
【问题描述】:

我拉了一个 MySQL docker(最新),在运行它之后,我试图在这个 mysql docker 实例中添加一些数据和新模式和表后提交我的容器。

供参考,我关注此链接 -> http://www.servermom.org/pull-docker-images-run-docker-containers/3225/

但即使尝试了多种变体,我也没有达到我想要的效果。所以我正在做的是在向我的容器添加新表和架构之后,我提交并推送到 Docker 集线器,如链接中所述。

之后,我将删除第一个拉取的图像,因为我已将新数据添加到容器并作为具有不同标签的新图像提交......我正在删除第一个拉取的图像。 (我这样做的原因是因为可以说如果我正在更换我的机器,当我对我提交的图像执行 docker pull 时,我可以获得完整的数据)

就像 git 一样,如果我 commit & push 并假设我的机器坏了,所以在新机器上我只需要做一个 git pull 就可以得到所有东西而不会造成任何损失。所以我无法理解为什么 docker 不保存更改

【问题讨论】:

    标签: docker virtualization docker-machine docker-container


    【解决方案1】:

    mysql 映像的数据存储在一个卷中。这意味着该卷内的文件不是映像的一部分,而是存储在主机上并分配给一个或多个正在运行的容器。

    为了实现你想要的,我看到了 2 个选项:

    1) 构建一个自定义的 mysql 镜像,在这里你可以在一个卷之外更改 mysql 的存储路径(或者只是创建一个没有卷的新 mysql 镜像)。

    2) 您可以使用自定义运行脚本/入口点扩展映像并在容器启动时包含架构修改命令

    这里是关于卷的文档页面:https://docs.docker.com/engine/admin/volumes/volumes/

    【讨论】:

    • 谈到 option-1 我只是使用 docker pull mysql:latest 拉取了一个 mysql 映像。并且我已经将我的架构和数据添加到那个..你的意思是说..??.
    • 不。如果您查看 here(这是您正在使用的映像的 Dockerfile),第 68 行有一条指令显示:VOLUME /var/lib/mysql。此目录是 mysql 映像存储其数据的地方。因此,当您在正在运行的容器中运行插入时,容器中唯一更改的路径是 /var/lib/mysql。由于这是一个卷,因此即使您提交了该更改,该更改也不会保存在映像中。这是 docker 工作方式的一部分。
    • 如果你想让数据变化在一个镜像中持久化,你需要通过编辑mysql存储数据的mysql配置文件来自定义原始镜像(实际上是/var/lib/mysql,你必须将其更改为其他地方)。这样,如果您进行提交,DBMS 的实际数据将持久保存在图像中。现在更有意义了吗?
    • 正如你所说,数据保存在磁盘上而不是卷上。我还尝试了我提供的链接中提到的示例,在该示例中,我们正在提取新的 Ubuntu 映像并使用包更新它然后只是安装 mysql-server 并检查服务的状态是否已启动......所以在这里我也尝试了同样的事情并将安装了 MySQL 的更新的 Ubuntu 映像推送到 docker hub 然后删除运行容器..
    • 然后使用标签从 docker HUB(我已经提交)中提取新的更新的 ubuntu 映像并运行它......其中 MySQL 服务也没有启动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2016-07-25
    • 2015-05-04
    • 2019-04-24
    • 2022-07-20
    • 2015-05-20
    相关资源
    最近更新 更多