如何使用docker-compose将Docker目录挂载到主机目录中

时间:2018-09-03 15:03:01

标签: docker docker-compose

想象一下,我有一个包含一些静态数据的Docker容器。

现在出于开发目的,我希望将容器目录/resources的内容装入我的本地工作目录.

docker-compose.yml:

version: '3.2'

services:
  resources:
    image: <private_registry>/resources:latest
    volumes:
    - ./resources:/resources

运行docker-compose up时,在我的工作目录中创建了文件夹resources,但文件夹中没有内容,而容器中的内容在/resources/

使用命名卷并对其进行检查时,它的工作与预期的一样。

2 个答案:

答案 0 :(得分:1)

在特定情况下,Docker为图像的内容提供了卷源的初始化:

  • 它必须是命名卷,而不是主机卷(映射到容器的路径)
  • 卷源必须为空,目录中一旦有数据,docker将不会更改
  • 仅在创建容器时(容器在运行时不会重新初始化文件夹)
  • 尚未设置禁用复制的选项(这是撰写文件中的“ nocopy”选项)。

您当前处于第一个要求的困境,但是可以使用执行绑定安装的命名卷将主机上的任何文件夹映射到容器。以下是三种不同方法的示例:

  # create the volume in advance
  $ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

  # create on the fly with --mount
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

  # inside a docker-compose file
  ...
  volumes:
    bind-test:
      driver: local
      driver_opts:
        type: none
        o: bind
        device: /home/user/test
  ...

您的示例看起来更像:

version: '3.2'

services:
  resources:
    image: <private_registry>/resources:latest
    volumes:
    - resources:/resources
volumes:
  resources:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /full/path/to/resources

请注意,该目录必须预先存在于主机上。没有主机绑定绑定安装将失败,并且与主机主机不同,docker不会为您创建它。

答案 1 :(得分:0)

这里有几件事。首先,在装载主机目录时,它会将给定路径上的所有现有内容“阴影化”,从而有效地将其替换为装载内容。因此,主机上的资源目录正在隐藏容器中的所有内容。

没有简单的方法可以解决您的问题。当我要在容器中和主机上编辑文件时,我将文件保留在主机上并将它们装入容器中。如果要复制容器,可以将主机目录挂载到容器中的其他目录,并安排要复制的文件。