如何在构建期间将主机卷装入Dockerfile的Docker容器中
原始问题:如何在Dockerfile中使用VOLUME指令?
修:从下面的答案更新,所以实际的问题,我想解决的是-如何构建过程中安装主机卷成搬运工集装箱Dockerfile,即具有docker run -v /export:/export
过程能力docker build
。
最新更新:现在有一个解决方案。 虽然它不是严格的Docker,但“它解决了Dockerfile的所有弱点”,所以我认为这是一个完美的答案。 详情请查看我的最新答案。
更新:所以答案是“不可能”。 我可以接受它作为答案,因为我知道这个问题已经在https://github.com/docker/docker/issues/3156进行了广泛的讨论。 我可以理解,可移植性对码头开发人员来说是一个至关重要的问题; 但作为码头使用者,我不得不说我对这个缺失的功能感到非常失望。 让我用前面提到的讨论引用我的观点:“我想使用Gentoo作为基本映像,但是一旦映像建好后,肯定不希望Portage树数据在任何层中都有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
指令不可能告诉docker要装载什么 。 这会严重破坏便携性。 该指令告诉docker这些目录中的内容不会--volumes-from
图像中,并且可以使用--volumes-from
命令行参数从其他容器访问。 您必须使用-v /path/on/host:/path/in/container
来运行-v /path/on/host:/path/in/container
以便从主机访问目录。
在构建过程中安装主机卷是不可能的。 没有特权的构建和安装主机也会严重降低可移植性。 您可能想尝试使用wget或curl来下载构建所需的任何内容并将其放置到位。
更新:有人不会采取不作为答案,我非常喜欢它,尤其是对这个特定的问题。
好消息,现在有一种方法 -
解决方案是Rocker:https://github.com/grammarly/rocker
约翰亚尼说:“国际海事组织,它解决了所有Dockerfile的弱点,使其适合开发。”
摇臂
https://github.com/grammarly/rocker
通过引入新的命令,Rocker的目标是解决以下使用案例,这对普通的Docker来说很痛苦:
和更多。 这些是阻碍我们在语法上采用Docker的最关键问题。
有一种在构建过程中安装卷的方法,但它不涉及Dockerfiles。
该技术将从您想使用的任何基础创建容器(使用-v
选项将容器安装在容器中),运行shell脚本来完成图像构建工作,然后将容器提交为图像完成后。
这样不但可以省去你不想要的多余文件(这对于安全文件也是如此,比如SSH文件),它还会创建单个映像。 它有缺点:commit命令不支持所有Dockerfile指令,并且如果需要编辑构建脚本,它不会让您在离开时启动。
链接地址: http://www.djcxy.com/p/18245.html上一篇: How to mount host volumes into docker containers in Dockerfile during build
下一篇: What is the (best) way to manage permissions for docker shared volumes