【问题标题】:Is there a way to replicate pwd in a volume mount for docker in a boot2docker context?有没有办法在 boot2docker 上下文中为 docker 复制卷挂载中的 pwd?
【发布时间】:2015-08-05 11:03:05
【问题描述】:

所以目前我可以这样做: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 的情况下让这一切正常工作(如上所述 CLI 和 compose 工作正常),但这意味着无法进行特定于项目的配置(bower install、npm install、vulcanize 等)。

【问题讨论】:

  • 注意:COPY. 一起工作得很好。

标签: docker provisioning boot2docker docker-compose


【解决方案1】:

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

如果你这样做:

VOLUME /usr/src/app

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

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

【讨论】:

  • “项目特定配置”指的是rake db:migrate
  • 将其更改为 VOLUME /sr/src/app 并没有解决问题,因为我处于 boot2docker 环境中,因此它不会复制任何内容。
  • 那么为什么不直接复制呢?我真的不明白你的意思。
  • 另外,到目前为止与 boot2docker 没有任何关系,在 Linux 上也是如此。
  • 因为COPYVOLUME不同,所以不会自动更新。我想共享目录、运行配置并能够使用服务器。
【解决方案2】:

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

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

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

现在在 runtime 期间,当您没有指定卷时,Docker 将为您生成一个默认为空的卷。

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

编辑

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

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

通过这种方法,您可以轻松地为已安装的卷提供默认文件集。当您重新使用该卷时,例如容器重新启动后,容器仅适用于卷上的文件,而不会在启动期间再次接触它们。所以修改后的文件会被持久化。

【讨论】:

  • > 而 Dockerfile 指令是在构建时执行的。好的,我知道你要去哪里了,但是 COPY 工作得很好!
  • A 对我的回答进行了编辑,并添加了一些关于项目配置的想法。
  • 我有点模糊,但这似乎与COPY vs VOLUME 有相同的问题,因为COPY 不“同步”文件?
猜你喜欢
  • 2020-03-02
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2016-02-27
  • 2015-10-01
  • 2017-09-19
相关资源
最近更新 更多