原始问题:如何在Dockerfile中使用VOLUME指令?
我要解决的实际问题是-如何在构建期间将主机卷挂载到Dockerfile中的Docker容器中,即在期间具有该docker run -v /export:/export
功能docker build
。
对我而言,其背后的原因是在Docker中构建东西时,我不希望将(apt-get install
)缓存锁定在单个Docker中,而是共享/重用它们。这就是我问这个问题的主要原因。
最新更新:
在docker v18.09之前,正确的答案应该是以下开头:
有一种在构建期间挂载卷的方法,但是它不涉及Dockerfiles。
但是,这是一个措辞不佳,组织有序且没有得到支持的答案。当我重新安装docker contains时,我偶然发现了以下文章:
Dockerize apt-cacher-ng服务
https://docs.docker.com/engine/examples/apt-cacher-ng/
那是码头工人对这个/我的问题的解决方案,不是直接而是间接的。这是docker建议我们这样做的正统方式。我承认这比我在这里要问的要好。
另一种方法是新接受的答案,例如v18.09中的Buildkit。
选择适合您的。
是:曾经有一个解决方案-摇杆,它不是来自Docker,但是现在摇杆已经停产了,我再次将答案恢复为“不可能”。
旧更新:答案是“不可能”。我可以接受它作为答案,因为我知道问题已经在https://github.com/docker/docker/issues/3156上进行了广泛讨论。我可以理解,对于Docker开发人员而言,可移植性是至关重要的问题。但是作为docker用户,我不得不说我对该功能的缺失感到非常失望。让我在前面的讨论中引用一句话来结束我的论点:“ 我想将Gentoo用作基本图像,但是绝对不希望在构建图像后将> 1GB的Portage树数据放在任何层中。您如果不是因为巨大的可移植树不必在安装过程中出现在映像中,则可能会有一些紧凑的容器。“是的,我可以使用wget或curl来下载所需的文件,但事实是,仅出于可移植性考虑,现在每次我构建Gentoo基本映像时都迫使我下载> 1GB的Portage树,这既无效率,也不友好。此外,软件包存储库将始终位于/ usr / portage下,因此始终位于Gentoo下。再次,我尊重这一决定,但同时也请允许我对我表示失望。
详细的原始问题:
从
通过卷共享目录
http://docker.readthedocs.org/en/v0.7.3/use/working_with_volumes/
它说数据卷功能“自Docker Remote API版本1起就已经可用”。我的泊坞窗版本为1.2.0,但是我发现上面文章中给出的示例不起作用:
# BUILD-USING: docker build -t data .
# RUN-USING: docker run -name DATA data
FROM busybox
VOLUME ["/var/volume1", "/var/volume2"]
CMD ["/usr/bin/true"]
Dockerfile中通过VOLUME命令将主机安装的卷挂载到Docker容器中的正确方法是什么?
$ apt-cache policy lxc-docker
lxc-docker:
Installed: 1.2.0
Candidate: 1.2.0
Version table:
*** 1.2.0 0
500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
100 /var/lib/dpkg/status
$ cat Dockerfile
FROM debian:sid
VOLUME ["/export"]
RUN ls -l /export
CMD ls -l /export
$ docker build -t data .
Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM debian:sid
---> 77e97a48ce6a
Step 1 : VOLUME ["/export"]
---> Using cache
---> 59b69b65a074
Step 2 : RUN ls -l /export
---> Running in df43c78d74be
total 0
---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
---> Running in 8e4916d3e390
---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551
$ docker run data
total 0
$ ls -l /export | wc
20 162 1131
$ docker -v
Docker version 1.2.0, build fa7b24f
VOLUME ~/host_dir ~/container_dir
。讨论非常广泛,因为有简短的方法可以总结原因是什么?