如何在构建期间将主机卷装入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来说很痛苦:

  • 在构建阶段挂载可重用卷,因此依赖项管理工具可以在构建之间使用缓存。
  • 与构建共享ssh密钥(用于拉取专用回购等),同时不会将它们留在生成的图像中。
  • 在不同的图像中构建和运行应用程序,能够轻松地将工件从一个图像传递到另一个图像,理想情况下在单个Dockerfile中具有此逻辑。
  • 直接从Dockerfiles标记/推送图像。
  • 从shell build命令传递变量,以便它们可以替换为Dockerfile。
  • 和更多。 这些是阻碍我们在语法上采用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