如何在Dockerfile中将文件放在共享卷上?

时间:2016-10-21 02:31:41

标签: docker dockerfile

我有一个Dockerfile,它构建了一个图像,为我提供了一个复杂的工具链环境,可以在主机文件系统的已装载卷上编译项目。另一个原因是我在图像上没有很多空间。

Dockerfile在操作系统映像中构建我的工具链,然后通过下载要放在主机共享卷上的包来准备源。通常从那里我然后登录图像并执行命令来构建。这就是问题所在。我可以在Dockerfile中下载源代码,但是如何将它下载到共享卷。

基本上我有......

ADD http://.../file mydir
VOLUME /home/me/mydir

但当然,我得到的错误是“无法在现有文件上安装音量......”

我是不是错了?

1 个答案:

答案 0 :(得分:5)

你错了,但你已经怀疑了。

如果您希望源文件驻留在主机文件系统上,请删除Dockerfile中的VOLUME指令,并且不要在构建时尝试下载源文件。这是您希望在运行时执行的操作。您可能希望使用一对脚本配置图像:

  • 将文件下载到特定位置的文件,例如/build

  • 实际运行构建过程的另一个。

有了这些,您可以先将源文件下载到主机文件系统上的某个位置,如:

docker run -v /path/on/my/host:/build myimage fetch-sources

然后你可以通过运行来构建它们:

docker run -v /path/on/my/host:/build myimage build-sources

使用这个模型:

  • 您在图像构建过程中尝试使用卷进行清理。这几乎不是您想要的,因为存储在卷中的数据明确地从图像中排除,并且构建过程不允许您方便地将主机目录安装在容器内。

  • 您可以将文件下载到主机上的永久位置,您可以在其中进行编辑或重建,或其他任何位置。

  • 您可以多次运行构建过程,而无需每次都重新下载源文件。

我认为这会做你想要的,但如果它不能满足你的需求,或者有些事情不清楚,请告诉我。