Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Build Dockerfile;docker生成卷:不会放弃通过添加或复制对卷所做的更改_Build_Docker_Volume_Dockerfile - Fatal编程技术网

Build Dockerfile;docker生成卷:不会放弃通过添加或复制对卷所做的更改

Build Dockerfile;docker生成卷:不会放弃通过添加或复制对卷所做的更改,build,docker,volume,dockerfile,Build,Docker,Volume,Dockerfile,我有一个dockerfile,其中包含以下内容: VOLUME /tmp/space ADD local/directory/ /tmp/space/ RUN cp /tmp/space/somescript.sh /opt/real/space/ 在构建容器并获得交互式shell之后,我注意到/tmp/space仍然包含来自local/directory的数据 如果我在dockerfile的末尾添加运行rm-rf/tmp/space/*,并获得shell访问权限。数据仍在/tmp/space

我有一个dockerfile,其中包含以下内容:

VOLUME /tmp/space
ADD local/directory/ /tmp/space/
RUN cp /tmp/space/somescript.sh /opt/real/space/
在构建容器并获得交互式shell之后,我注意到/tmp/space仍然包含来自local/directory的数据

如果我在dockerfile的末尾添加
运行rm-rf/tmp/space/*
,并获得shell访问权限。数据仍在/tmp/space/中

因此,我将使用相同的卷创建一个正在运行的容器,然后将更改的容器提交到更新的映像

是否有一种方法可以在构建过程中临时加载一个不会使生成的映像膨胀的卷


目标是在构建过程中使用源文件和脚本执行一些操作。docker的层最终记录了
COPY/ADD
步骤和
RUN
步骤的副本。因此,最好将数据
复制到未记录为层的空间中,然后作为单个
运行
步骤
cp stuff&&execute scripts
,以节省空间。

我不确定您在这里想做什么: VOLUME/tmp/space—声明一个装载点,并将容器上的/tmp/space映射到主机上的一个目录

ADD/local/directory/tmp/space—我认为您正在尝试将本地目录从容器复制到装入的卷

运行cp/tmp/space/*/opt/real/space/-您正在尝试从卷复制到主机吗

在dockerfile中添加卷指令后,发生的情况是容器/tmp/space中的文件夹映射到主机上的文件夹,例如/hosttmp/hostspace。您可以通过运行以下命令来了解主机上的内容-

$ docker inspect -f {{.Volumes}} <your_container_name>
$docker inspect-f{{.Volumes}
为了防止损坏/hosttmp/hostspace中的数据,一旦在dockerfile中声明了卷,就不能随意处理内容

我建议阅读这篇文章,因为它解释了相当混乱的docker卷概念


我编辑了这个问题,试图让它更清楚地说明我想做什么。我遇到的问题是卷没有映射到docker文件中添加和复制命令的本地文件夹(编写时运行docker 1.9.1)。您需要将卷命令移动到docker文件的末尾。这是在您将任何添加或复制命令添加到该文件夹后进行的。最后一步应该是挂载它,即Volumeb,但我试图做的是在构建过程中使用文件,使它们不会最终出现在生成的映像中。我希望在添加或复制之前添加卷,这样这些文件就不会出现在生成的映像中。我终于明白了您想要做什么。您希望在生成过程中使用一些文件,然后在生成后删除它们。要做到这一点,您不需要音量。您可以添加或复制文件,然后在启动容器之前,可以运行rm-rf/tmp/space,这应该可以正常工作。我和docker开了一个漏洞。如果添加单个文件,则不会按预期将其添加到映像中,但是如果通过通配符或作为整个目录的一部分添加文件,则会将其永久添加到映像中。我最终要做的是对整个本地文件夹使用COPY,并维护DockerInore文件,以跳过生成的映像中不需要的文件。虽然不理想,但最终还是为我节省了大约200MB的空间。