有没有办法在boot2docker上下文中为docker的卷挂载复制pwd?

时间:2015-08-05 11:03:05

标签: docker provisioning boot2docker docker-compose

目前我可以这样做:docker -v .:/usr/src/app甚至可以在docker-compose.yml中指定:

web:
  volumes:
    - .:/usr/src/app

但是当我尝试在我的Dockerfile中定义它时:

VOLUME .:/usr/src/app

它没有任何东西。

现在我理解我使用OSX的复杂性,所以我必须虚拟化环境以通过boot2docker运行Docker,并且boot2docker通过将/User挂载到运行的linux机器来解决复制问题泊坞。

文档要求我明确,但由于我的明确要求我命名我的用户(在这种情况下/User/krainboltgreene/code/krainboltgreene/blankrails),这似乎是非惯用的,因为这显然不适用于其他人& #39;环境。

解决方案是什么?我的意思是,从技术上讲,我可以在没有这一切的情况下工作(如上所述CLI和compose工作正常),但这意味着无法进行项目特定的配置(bower安装,npm安装,硫化等)。

2 个答案:

答案 0 :(得分:1)

您无法为Dockerfile中的卷指定主机目录,因为您提到的可移植性原因(并非每个人都有相同的目录,并且存在有关安装敏感文件的安全问题)。

如果您改为:

VOLUME /usr/src/app

Docker会在运行时为该文件夹自动设置一个卷,该卷将映射到/var/lib/docker/volumes下的目录。

如果您希望能够在开发过程中快速进行更改,我建议在Dockerfile中使用COPY,但在运行时使用卷在顶部安装本地更改。这样做的缺点是,如果您批量安装文件夹,容器中该目录的所有内容都将被隐藏(而不是合并)。

答案 1 :(得分:0)

在{strong>运行时期间执行docker run -v .:/usr/src/app ...命令以及docker-compose定义。而Dockerfile指令在构建时间期间执行。

顺便说一下Dockerfile中的指令在语法上是不正确的。它应该是VOLUME /usr/src/app

VOLUME关键字仅定义稍后在运行时此位置将存储在卷上。因此,您通过进一步Dockerfile指令或手动提交添加到该位置的所有文件都将被忽略,并且不会添加到生成的图像中。

现在在运行时期间,当你没有指定一个卷时,Docker会为你生成一个默认为空的卷。

要让docker-compose设置为其他同事工作,您只需将docker-compose配置文件作为blankrails项目文件夹的一部分即可。然后每个人都从该目录中运行docker-compose,并且您提供的配置将起作用。

修改

我不清楚您对项目特定配置的确切含义。但是,如果您的目标是为定义的卷提供默认内容,则可以执行以下操作:

  • Dockerfile版本中将所有必需的项目文件添加到图片上的/bootstrap文件夹中。
  • 不是直接执行您的应用,而是使用CMD的启动shell脚本。
  • 在该启动脚本中,您可以检查装入/usr/src/app的卷是否为空。如果为空,请将所有/bootstrap内容复制到其中。
  • 然后在前台的该脚本中启动您的应用程序。

使用该方法,您可以轻松地为已安装的卷提供默认文件集。当您重新使用该卷时,例如容器重启后,容器只能处理卷上的文件,而不会在启动时再次触摸它们。因此修改后的文件将被保留。