如何从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过程,而无需每次重新下载源文件。

我认为这将会做你想要的东西,但是如果它不能满足你的需求,或者如果有什么不清楚的地方,请告诉我。