当我尝试通过具有现有容器的docker rmi
删除图像时,出现错误消息。 (正常)
当我添加强制标志docker rmi -f
时,该图像将被删除;当我使用docker ps -a
检查容器状态时,该容器仍然存在,但图像名称将成为ID。
所以我的问题是,此ID从何而来?当我检查docker images
时,是否找到了具有repo和名称的图像,并且它的ID是对旧的现有容器新近影响的图像,是它保留在缓存中并用于现有容器的图像的副本吗?
接下来的另一个问题:
创建容器后,更改现有(本地)镜像上的任何内容是否会以任何方式影响现有容器?
谢谢。
最佳答案
docker 镜像具有名称和镜像ID。此blog描述了在docker-v1.10之前和之后来自镜像ID的位置。
如果您对正在运行的容器使用的镜像执行docker rmi -f镜像,则实际上不是删除真实镜像,而是删除镜像上的名称和标记。
所以确实docker ps
将显示:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
578e28246977 96931e4c66bd "/bin/tini -- /usr/lo" 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp drunk_shannon
但是
docker images
仍然显示您的图片:<none> <none> 96931e4c66bd 6 weeks ago 711.9 MB
它没有标签。删除此容器后,该图像也不会被删除。该图像保留在列表中。您可以使用
docker run -d 96931e4c66bd
从中启动新容器(使用ID)您甚至可以重新标记它:
docker tag 96931e4c66bd my-jenkins:1.0
比
docker images
显示:my-jenkins 1.0 96931e4c66bd 6 weeks ago 711.9 MB
不,当您对镜像(名称相同)进行“更新”时,正在运行的容器可能会丢失其镜像名称(仅具有ID,就像在容器运行期间删除镜像时一样)。
您需要使用新镜像重新执行运行命令(更新后将具有另一个镜像ID),以使容器从最新镜像运行。
关于docker - 强制删除Docker镜像如何影响使用它的现有容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40448210/