Windows 上的最佳实践 Docker 卷

Best practice Docker volumes on Windows

我是 运行 Windows 10,我想使用 docker-compose 将主机的一些目录挂载到 docker 容器中。

假设我有一个包含图片的文件夹: D:\MyPictures

我想在 Docker 中创建一个卷,并将该卷装入不同的容器中以便能够访问图片。 最好我只需要定义一次我的卷,这样我就可以通过名称或类似的方式引用它(如果我以后想移动图片文件夹,我只有一个地方可以更新路径)。 如果我可以为每个容器指定容器是否具有 read/write 访问权限或仅读取访问权限,那也很好。

我知道直接在一个服务下指定卷怎么办:

myservice:
  volumes:
    - /c/MyPictures:/mount/path/in/container

但是如果我移动我的照片,我会有多个地方来更新路径。

并且在阅读有关使用 docker volume create 创建卷时,我似乎无法为每个容器指定 read/write 访问权限。

在 Windows 上实现此目标的最佳和最简单的方法是什么?

最佳答案(由 orderlyfashion 找到):

使用环境变量。

  1. 使用变量 MY_PICTURES=/c/MyPictures
  2. 创建一个文件 globals.env
  3. docker-compose.yml 中,在容器的卷部分下,安装为:- ${MY_PICTURES}:/my_pictures:ro
  4. docker-compose --env-file global.env up
  5. 开始

如果您使用 docker volume create 创建卷,则可以在 compose 的顶级 volume 部分指定它,然后使用卷的名称后跟路径和每个容器中的访问权限,您不会停止指定访问权限。

查看更多here,特别是

The short syntax uses the generic [SOURCE:]TARGET[:MODE] format, where SOURCE can be either a host path or volume name. TARGET is the container path where the volume is mounted. Standard modes are ro for read-only and rw for read-write (default).


这样做的下一个问题是命名卷不能绑定到特定文件夹,这与绑定装载相反。

当您执行 -v <hostPath>:<containerPath> 时,您会创建一个绑定安装。它是挂载在容器文件系统中的主机文件系统中的一个特定文件夹,一切都很好,但它有一个缺点:它不能共享。

当您添加 volumes 顶级选项或执行 docker volume create 时,您会创建一个命名卷。命名卷是一个 space ,可以跨容器共享,但不能绑定到主机上的特定文件夹。但是如果你往这个卷写数据,它就留在里面,它是一个持久卷。

所以问题是:如何用数据初始化这个卷?答案是将该卷安装在一个容器中,该容器将数据写入该卷。它不优雅,有点复杂,但这就是解决方案...

怎么做:

在你docker-compose.yml,添加这个服务和音量:

services:
  initializer:
    image: <someimage> #I use python:3.9-slim, could be a simple busybox
    command: cp -R /mnt/. /media/
    volumes:
      - ./somefolder:/mnt
      - data_volume:/media
    service_you_want_to_attach_volume_to:
      ...
      volumes:
        - data_volume:<some path>:ro #or rw, you can set the rights per container
      depends_on:
        - initializer

volumes:
  data_volume:

容器初始化程序将启动,将包含您想要的数据的文件夹装载到 /mnt 中,将指定的卷装载到 /media 中,从 /mnt 中复制数据 (因此您要共享的数据) 到 /media (共享它的指定卷) 然后停止 (因为它已完成其主要进程)

命名卷现已初始化,可以共享给任何具有所需访问权限(rorw)的容器。

UPSIDES : 一切都在 docker 卷中,易于备份 缺点:数据在卷内复制。你会得到两倍相同数量的数据,除非你重新初始化,否则数据不会更新