当前位置: 首页 > 知识库问答 >
问题:

从提交的Docker容器运行时,删除的文件会重新出现

陈实
2023-03-14

下面是我面临的问题的一个简单例子。

简言之:提交初始容器并从提交的容器创建新容器后,将重新出现我从Docker容器中删除的文件。

我有以下Dockerfile:

FROM ubuntu:latest

VOLUME /docker-entrypoint-initdb.d

COPY docker-entrypoint.sh /usr/local/bin/
COPY docker-entrypoint-initdb.sh /usr/local/bin/
COPY delete-me.sh /docker-entrypoint-initdb.d/setup/

ENTRYPOINT "docker-entrypoint.sh"

我设置了一个卷并将一些文件复制到容器中。

docker-entrypoint.sh=

#!/usr/bin/env bash

docker-entrypoint-initdb.sh && exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

docker-entrypoint-initdb.sh=

#!/usr/bin/env bash
sh /docker-entrypoint-initdb.d/setup/delete-me.sh
rm -R /docker-entrypoint-initdb.d/setup/ 2> /dev/null

delete-me.sh=

echo DELETE_ME

容器是使用commandocker build-f Dockerfile-t ubu测试构建的。

并使用docker run-d ubu-test运行。

在我第一次运行容器后,它被正确地设置。脚本delete-me.sh运行并被docker-entrypoint-initdb.sh.删除

docker在第一次运行后提交容器。

现在的问题是:当我从提交的容器创建一个新容器时,文件delete-me.sh又出现了。

我不明白为什么。(我确认它已被docker exec-it提交到它的容器中删除。)


共有1个答案

司空坚
2023-03-14

问题是由音量引起的。按照docker提交文件中的规定:

提交操作将不包括容器内装入的卷中包含的任何数据。

Docker提交将容器文件系统更改提交到新映像中。由于/docker entrypoint initdb.d是一个卷,因此在此目录下所做的所有文件更改都不会成为提交的容器的一部分,因为卷不会存储在存储容器的“写时拷贝”文件系统中。

作为解决方案,您可以从Dockerfile中删除声明。

或者,为卷指定一个名称并按如下方式重新使用:

docker run -v initdb:/docker-entrypoint-initdb.d -d ubu-test
 类似资料:
  • 如何从最新提交中删除文件?

  • 我希望停止并移除正在运行的容器。 总回收空间:0B返回结果 为什么会这样

  • 我想知道在tomcat/webapps文件夹中的根文件夹被Docker映像部署后,是否有任何方法可以删除它。 我想要实现这一点的原因是我想要运行我的.war文件作为根。我已经将war文件重命名为root.war。但是当我使用tomcat基映像运行Docker映像时,默认情况下还会在容器的tomcat/webapps文件夹中创建根文件夹,该文件夹不允许我作为根访问我的ROOT.war文件。 我的Do

  • docker错误: PS C:\Windows\System32>docker运行测试错误:出现JNI错误,请检查线程“main”java.lang.noClassDeffounderRorr:javax/JMSException在java.lang.Class.GetDeclaredMethods0(本机方法)在java.lang.Class.GetDeclaredMethods(class.j

  • 我想删除这两个图像 如何走出圈子?

  • 我记得用过 几个月前没有问题地链接命令,但现在这不起作用了,我得到了以下输出: 什么改变了?如何在一行中删除所有Docker运行容器?如果有用的话,我正在Windows ;10上使用Docker for Windows(本机与Hyper-V一起使用,而不是与VirtualBox一起使用),我使用的命令在以前的Windows 8 Docker工具箱安装中运行良好。