如何从Dockerfile中的共享卷上放置文件?
我有一个Dockerfile,它构build了一个图像,为我提供了一个复杂的工具链环境,用于从主机文件系统编译已安装卷上的项目。 另一个原因是我没有太多的图像空间。
Dockerfile在OS映像中构build我的工具链,然后通过下载要放置在主机共享卷上的软件包来准备源文件。 通常从那里我会login到图像,并执行命令来build立。 这是问题所在。 我可以在Dockerfile中下载源代码,但是我怎样才能将它join共享卷。
基本上我有…
ADD http://.../file mydir VOLUME /home/me/mydir
但是,当然,我得到错误“无法在现有文件上挂载卷…”
我是否在谈论这个错误?
你错了,但是你已经猜到了。
如果你想让源文件驻留在主机文件系统上,可以在Dockerfile中删除VOLUME
指令,而不要在构build时下载源文件。 这是你想要在运行时做的事情。 您可能想要使用一对脚本来configuration您的映像:
-
一个下载文件到一个特定的位置,说
/build
。 -
另一个实际运行构build过程。
有了这些,您可以先将源文件下载到主机文件系统的某个位置,如下所示:
docker run -v /path/on/my/host:/build myimage fetch-sources
然后你可以通过运行来构build它们:
docker run -v /path/on/my/host:/build myimage build-sources
有了这个模型:
-
您正在图像构build过程中尝试使用卷。 这几乎从来不是你想要的,因为存储在卷中的数据被明确地从映像中排除,并且构build过程不允许你在容器内方便地挂载主机目录。
-
您可以将这些文件下载到主机上的一个永久性位置,在那里它们可供您进行编辑或重新构build等等。
-
您可以多次运行构build过程,而无需每次重新下载源文件。
我认为这将会做你想要的东西,但是如果它不能满足你的需求,或者如果有什么不清楚的地方,请告诉我。