自2014年提出这个问题以来,发生了许多情况,许多事情发生了变化。今天我再次讨论这个话题,这是我第12次编辑这个问题,以反映最新的变化。这个问题可能看起来很长,但它是按倒序排列的,所以最新的变化在顶部,你可以随时停止阅读。
我想解决的问题是——如何在构建期间将主机卷挂载到Dockerfile中的docker容器中,即在docker build
期间具有docker run -v /export:/export
能力。
对我来说,它背后的一个原因是,当在Docker中构建东西时,我不希望那些(apt-get install
)缓存锁定在单个Docker中,而是共享/重用它们。
这就是我问这个问题的主要原因。我今天面临的另一个原因是试图利用来自主机的巨大私人回购,否则我必须使用我的私人ssh密钥从docker内部的私人回购执行git clone
,我不知道如何,也没有研究过。
最新更新:
@BMitch回答中的Buildkit
使用
RUN --mount
语法,你还可以从build-context…
它现在已经内置在docker(我认为是第三方工具),只要你的'超过18.09。我的现在是20.10.7 https://docs.docker.com/develop/develop-images/build_enhancements/ < / p >
要启用BuildKit构建
重新安装docker最简单的方法是在调用docker build命令时设置DOCKER_BUILDKIT=1环境变量,例如:
$ DOCKER_BUILDKIT=1 docker build .
否则,你会得到:
the --mount option requires BuildKit. Refer to https://docs.docker.com/go/buildkit/ to learn how to build images with BuildKit enabled
因此,它将是我上面解释的第二个用例的完美解决方案。
截至2019年5月7日更新:
在docker v18.09之前,正确的答案应该是以:
有一种方法可以在构建期间挂载卷,但它不涉及Dockerfiles。
然而,这是一个陈述不当、组织不当和支持不足的回答。当我重新安装我的docker contains时,我碰巧发现了以下文章:
< p > Dockerize apt-cache -ng服务 < br / > https://docs.docker.com/engine/examples/apt-cacher-ng/ < / p >这是码头工人对这个/我的问题的解决方案,不是直接的,而是间接的。这是docker建议我们做的正统方法。我承认这比我在这里想问的要好。
另一种方法是新接受的答案,例如,v18.09中的Buildkit。
挑一个适合你的。
是:曾经有一个解决方案——rocker,它不是来自Docker,但现在rocker停止了,我再次将答案恢复到“不是possible"。
旧的更新:所以答案是“不可能”。我可以接受这个答案,因为我知道这个问题在https://github.com/docker/docker/issues/3156上已经被广泛讨论过了。我能理解可移植性对于docker开发者来说是最重要的问题;但是作为一个docker用户,我不得不说我对这个缺失的特性感到非常失望。让我引用前面讨论中的一句话来结束我的论点:是的,我可以使用wget或curl下载我需要的任何东西,但事实上,仅仅是出于可移植性的考虑,现在迫使我下载>每次我构建一个Gentoo基映像时,1GB的Portage树既不高效也不友好。此外,包存储库总是在/usr/portage下,因此总是可以在Gentoo下移植。我再次尊重这个决定,但同时也请允许我表达我的失望。谢谢。
最初的问题详细信息
从
< p > 通过卷共享目录 < br / > http://docker.readthedocs.org/en/v0.7.3/use/working_with_volumes/ < / p >它说数据卷功能“从Docker远程api的版本1开始就可以使用”。我的docker是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