"--rm"标志是做什么的?

192

我第一次尝试Docker,还没有建立起"心智模型"。完全是初学者。

我正在查看的所有示例都包含--rm标志来运行,例如

docker run -it --rm ...
docker container run -it --rm ...

问题:

为什么这些命令包括--rm标志?我认为如果我费力地设置或下载一个包含好东西的容器,为什么要删除它?我想保留它以便再次使用。

所以,我知道我对Docker的理解是错误的。


28
--rm 选项会删除已停止的容器(由 docker run 命令创建的容器),而不是其所基于的镜像(你下载的那个镜像)。 - Ry-
1
docker run --help应该很有用。如果您不想删除容器,可以传递它。 - indapublic
2
它必须是“--rm”,这样当容器退出并且文件系统时,它会自动清理容器并删除文件系统,但不意味着从容器中删除内容。 - Mahattam
3
你不会下载容器,你会下载镜像。请在这里阅读以了解镜像和容器之间的区别:https://docs.docker.com/engine/docker-overview/#docker-objects - axiac
6个回答

167

容器仅是您用来运行它们的镜像的实例。 创建容器应该不只是使用一个干净的Ubuntu容器,然后下载您想要的应用程序和配置,让它运行。

您应该将容器视为应用程序的实例,但是您的应用程序嵌入到镜像中。正确的做法是创建自定义镜像,在其中嵌入所有文件、配置、环境变量等。有关Dockerfile以及如何完成此操作的更多信息,请单击此处

一旦完成了上述步骤,您就会拥有一个包含所有内容的镜像。要使用您的应用程序,只需使用适当的端口设置或其他动态变量运行镜像,使用docker run <your-image>

对于那些您只是短时间内使用的容器(例如在容器中编译应用程序或测试某些功能),使用--rm标志非常合适。这时您可以告诉Docker守护程序,在容器完成任务并且不再需要时删除所有相关内容,从而节省磁盘空间。


将环境变量传递给docker run是否是更好的选择?这样你就可以使用不同的配置(例如生产与预生产)开始工作了。 - SCO
生产环境与测试环境是一个很好的例子,您可能希望使用环境变量来进行分离,并使您的应用程序从相同的镜像运行,但每个环境具有不同的设置。 - buddy123
有没有一种方法可以在用户关闭终端窗口时自动删除使用 --rm 启动的容器,而不是在容器 shell 中故意运行 exit,我注意到在这种情况下容器不会被删除。 - venkrao

67

当您需要容器在完成任务后被删除时,可以使用标记--rm

这适用于小型测试或POC目的,并为维护带来方便。


29

来自https://docs.docker.com/engine/reference/run/#clean-up---rm

默认情况下,容器的文件系统会在容器退出后保留。这使得调试变得更加容易(因为您可以检查最终状态),并且默认情况下保留所有数据。但是,如果您正在运行短期前台进程,则这些容器文件系统可能会真正堆积。如果您希望Docker在容器退出时自动清理容器并删除文件系统,则可以添加--rm标志。

简而言之,保持主机不受停止和未使用的容器的影响很有用。


4

当你使用简单的命令(docker run -it ubuntu)从镜像中运行容器时,它会创建一个容器。你可以使用 docker attach container-name(或者使用 exec 命令打开不同的会话)来连接到容器。

所以,当你在容器内部工作并且输入 exitctrl+z 或任何其他方式退出容器时,容器将停止。这意味着你的容器已经停止了,但是它仍然保存在你的磁盘上,并且你可以使用 docker start container-name/ID 命令重新启动它。

但是,如果你使用了 --rm 标签运行容器,在退出容器后,容器将被永久删除。


1

当我需要连接到正在运行的容器执行某些操作(如数据库备份或文件复制)时,我会使用--rm。以下是一个例子:

docker run -v $(pwd):/mnt --link app_postgres_1:pg --rm postgres:9.5 pg_dump -U postgres -h pg -f /mnt/docker_pg.dump1 app_db

以上命令将连接到名为'app_postgres_1'的运行中的容器并创建一个备份。备份完成后,容器将被完全删除。


1

“docker run rm”命令使我们运行一个新容器,当工作完成后,通过删除它来节省磁盘空间。

需要注意的重要事项是,容器就像类实例一样,并不适用于数据存储。我们最好在工作完成后将它们删除。当我们重新启动时,它会重新开始。

那么问题就来了,如果容器被删除,容器中的数据怎么办?数据实际上保存在本地系统中,并在启动容器时链接到本地系统。这个概念被称为“卷或共享卷”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接