将 Docker 容器恢复到其原始映像而不重新启动它?

Posted

技术标签:

【中文标题】将 Docker 容器恢复到其原始映像而不重新启动它?【英文标题】:Revert a Docker container back to its original image without restarting it? 【发布时间】:2015-11-21 04:17:22 【问题描述】:

通常,人们都希望让 Docker 将数据持久保存在他们的容器中,并且关于如何做到这一点的问题大约有 2000 万个,但我是一名测试人员,我想将我刚刚对我的数据所做的所有废话转储并恢复到我已知的状态(也就是我的图像)。

我知道我可以通过根据我的图像启动一个新容器来做到这一点,但这迫使我断开并重新连接到我的容器的任何网络连接,这是一个巨大的痛苦。

是否可以在不重新启动的情况下将正在运行的容器恢复为其原始映像?

【问题讨论】:

【参考方案1】:

遗憾的是,当它运行时,您将无法还原或更改图像。您需要停止正在运行的容器并将其移除。一旦您的卷不再附加到任何容器,运行命令 docker volume prune 将销毁当前未附加到容器的所有卷。

然后,您可以简单地从映像中重新启动 docker 容器,然后您将重新开始。

我在学习docker时也发现这篇文章是一个很好的参考:https://web.archive.org/web/20190528002402/https://medium.com/the-code-review/top-10-docker-commands-you-cant-live-without-54fb6377f481

【讨论】:

哇,我不知道这篇文章有多老了。为什么今天美国东部时间上午 12:01 出现在我的 RSS 提要中? 您回答的是较早的问题没关系。我觉得还是有价值的。谁知道呢,也许有一天我想要的东西会成为可能:) 文章链接失效。 很抱歉听到这个 AlexD。我不控制那里的所有网络服务器/博客。这些事情发生了,原作者已经把它记下来了。它在 2019 年 1 月发布时有效。 这不适用于我启动容器、开始测试运行、测试运行需要永远并建立大量积压、停止容器、进行修剪、重新启动容器的用例, 容器拾取旧数据并继续长时间运行的过程。【参考方案2】:

要恢复到原始状态,您必须重新启动容器 - 这很重要,因为容器映像只是一堆文件,实际运行的容器必须启动一些进程,因此,您无法恢复容器在运行时,因为该进程很可能会出现问题。

所以回答你的问题 - 重新启动容器,一个 docker 映像只需几毫秒即可启动 - 其余时间是启动过程。

【讨论】:

这仅在卷不是由映像创建的情况下才有效。如果图像有音量命令,则无论重新启动,数据都会保留。 不幸的是,简单地重新启动一个容器(即使是一个不将其数据写入卷的容器)并不会删除更改。我必须在我的图像上调用docker run 才能获得一个带有新图像的容器。 docker restartdocker stop/start 不足。 我应该更清楚,我不是说docker restart 而是创建一个新容器。【参考方案3】:

不要将卷安装到容器。卷,无论是数据还是 fs 挂载都是持久的。如果你不持久化数据,你可以去 docker restart 我的容器。

【讨论】:

【参考方案4】:

我在 Windows 环境中。下面显示的这个脚本对我有用。基本上你正在删除容器(这没关系,因为在调用 docker up 时它很容易从映像中重建),然后删除现在孤立的卷。

这会删除在 Docker 中运行的所有容器,这对我有用,因为我只运行一个应用程序。如果您正在运行多个应用程序,您可能需要修改您的解决方案。

我不确定如何仅按名称删除***应用。

(将“myapp”替换为您的应用名称)

@echo off
echo.
echo.
echo Deleting Containers...
FOR /f "tokens=*" %%i IN ('docker ps -aq') DO docker rm %%i
echo.
echo Pruning orphaned volumes
docker volume prune -f
echo.
echo Starting myapp...
docker-compose -p myapp -f ../tools/docker-compose.yml up --remove-orphans
echo.
echo.
echo Done.
echo.
echo.

【讨论】:

以上是关于将 Docker 容器恢复到其原始映像而不重新启动它?的主要内容,如果未能解决你的问题,请参考以下文章

原始 IP 未传递到 AWS Elastic Beanstalk 上的单个容器 Docker 映像上的容器

在 warpAffine 转换后如何将点重新映射或恢复到其以前的坐标系?

如何在同一个 docker 映像上使用不同类型的 gpus(例如 1080Ti 与 2080Ti)而不需要重新运行“python setup.py develop”?

如何在 kubernetes 中使用 yaml 文件删除和重新创建 pod

如何将 MySQL 转储从主机恢复到 Docker 容器

如何将映像创建的卷与 docker-compose 指定的命名卷链接?