我有一个Dockerfile,它构建了一个图像,为我提供了一个复杂的工具链环境,可以在主机文件系统的已装载卷上编译项目。另一个原因是我在图像上没有很多空间。
Dockerfile在操作系统映像中构建我的工具链,然后通过下载要放在主机共享卷上的包来准备源。通常从那里我然后登录图像并执行命令来构建。这就是问题所在。我可以在Dockerfile中下载源代码,但是如何将它下载到共享卷。
基本上我有......
ADD http://.../file mydir
VOLUME /home/me/mydir
但当然,我得到的错误是“无法在现有文件上安装音量......”
我是不是错了?
答案 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
使用这个模型:
您在图像构建过程中尝试使用卷进行清理。这几乎不是您想要的,因为存储在卷中的数据明确地从图像中排除,并且构建过程不允许您方便地将主机目录安装在容器内。
您可以将文件下载到主机上的永久位置,您可以在其中进行编辑或重建,或其他任何位置。
您可以多次运行构建过程,而无需每次都重新下载源文件。
我认为这会做你想要的,但如果它不能满足你的需求,或者有些事情不清楚,请告诉我。