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

有没有办法在boot2docker上下文中为docker复制卷装载中的pwd?,docker,provisioning,boot2docker,docker-compose,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装载到运行Docker的linux机器上来解决复

所以现在我可以做:
docker-v.:/usr/src/app
,甚至在我的
docker compose.yml中指定它:

web:
  volumes:
    - .:/usr/src/app
但是当我试图在我的
Dockerfile
中定义它时:

VOLUME .:/usr/src/app
它没有挂载任何东西

现在我了解了使用OSX的复杂性,因此我必须通过boot2docker虚拟化运行Docker的环境,boot2docker通过将
/User
装载到运行Docker的linux机器上来解决复制问题

文档希望我是明确的,但由于我的明确性要求我命名我的用户(在本例中为
/user/krainboltgreene/code/krainboltgreene/blankrails
),因此它似乎不惯用,因为这显然不适用于其他人的环境


解决这个问题的办法是什么?我的意思是,从技术上讲,我可以在没有(如上所述,CLI和compose可以正常工作)的情况下实现这一切,但这意味着无法执行特定于项目的资源调配(bower安装、npm安装、硫化等)。

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

如果您改为:

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


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

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

VOLUME
关键字仅定义了在运行期间稍后此位置将存储在卷上。因此,通过进一步
Dockerfile
说明或手动提交到该位置的所有文件都将被忽略,而不会添加到结果图像中

现在,在运行时,当您未指定卷时,Docker将为您生成一个默认为空的卷

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

编辑

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

  • Dockerfile
    生成期间,将所有必需的项目文件添加到映像上的
    /bootstrap
    文件夹中
  • 不要直接执行应用程序,而是使用
    CMD
    的启动shell脚本
  • 在该启动脚本中,您可以检查装载到
    /usr/src/app
    的卷是否为空。当该卷为空时,将所有
    /bootstrap
    内容复制到该卷中
  • 然后从前台的脚本中启动应用程序

使用这种方法,您可以轻松地为已装入的卷提供默认文件集。当您重新使用该卷时(例如,在容器重新启动后),容器只处理卷上的文件,而不会在启动过程中再次接触这些文件。因此,修改后的文件将保持不变。

>而Dockerfile指令在正在生成时间。好的,我知道你要去哪里,但是
COPY
工作得很好!A对我的答案进行了编辑,并添加了一些关于项目资源调配的想法。我有点模糊,但这似乎与
COPY
vs
VOLUME
有相同的问题,因为
COPY
不“同步”文件?注意:
COPY
可以将
用作路径。“特定于项目的资源调配”指的是
rake db:migrate
。将其更改为
VOLUME/sr/src/app
并没有很好地解决问题,因为它不会复制任何东西,因为我在
boot2docker
环境中。那么为什么不直接复制呢?我真的不知道你要做什么。而且,到目前为止,与boot2没有任何关系docker,它在Linux上是一样的。因为
COPY
VOLUME
不同,它不会自动更新。我想共享目录,运行资源调配,并能够使用服务器。