docker run:为什么使用--rm(docker newbie)


102

我是第一次尝试docker,还没有“心理模型”。总计初学者。

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

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

题:

为什么这些命令包含--rm标志?我会认为,如果要麻烦设置或下载包含好东西的容器,为什么要删除它?我想让它再次使用。

所以,我知道我对Docker的想法不正确。


5
--rm删除停止的容器(docker run创建的容器),而不是它所基于的图像(下载的图像)。
Ry-

docker run --help应该有用。如果您不想删除容器,则可以通过它
indapublic

1
它必须是--rm自动清除容器并在容器退出时删除文件系统,这并不意味着从容器中删除内容。
Mahattam'4

2
您不下载容器,而是下载图像。阅读此处以了解图像和容器之间的区别:docs.docker.com/engine/docker-overview/#docker-objects
axiac

Answers:


94

容器只是您用于运行它们的映像的一个实例。创建容器化应用程序时的心态不是通过例如获取一个全新的,干净的ubuntu容器,然后下载您希望包含在其中的应用程序和配置,然后使其运行即可。

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

完成此操作后,您将拥有一个包含所有内容的映像,并且要使用您的应用程序,只需使用适当的端口设置或其他动态变量运行该映像,即可使用 docker run <your-image>

运行带有--rm标志的容器对于那些只用于很短时间而仅用于完成某事的容器是有好处的,例如,在容器内编译应用程序,或者只是测试它可以工作的事物,然后您就会知道它是一个短暂的容器,告诉您的Docker守护程序,一旦运行完毕,请清除与其相关的所有内容并节省磁盘空间。


将环境变量传递给docker run是一个更好的选择。这样,您可以从不同的配置开始(例如,生产与试生产)?
SCO

Prod vs Test环境是一个很好的示例,您可能希望使用env var进行分离,并使您的应用从同一图像运行,但是每个env的设置都不同
buddy123 '18

--rm当用户关闭终端窗口时,有没有一种方法可以自动删除开始使用的容器。即不是故意exit在容器外壳中运行,而是仅关闭终端GUI窗口。我注意到在这种情况下不会删除容器。
venkrao

20

--rm当您需要在完成容器的任务后将其删除时,可以使用该标志。

这适用于小型测试或POC,并节省了打扫房间的麻烦。


16

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

默认情况下,即使容器退出后,容器的文件系统也会保留。这使调试变得容易得多(因为您可以检查最终状态),并且默认情况下保留所有数据。但是,如果您正在运行短期前台进程,那么这些容器文件系统确实会堆积起来。相反,如果您希望Docker自动清理容器并在容器退出时删除文件系统,则可以添加--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”的容器并创建一个备份。备份命令完成后,将完全删除该容器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.