最佳答案(由 orderlyfashion 找到):
使用环境变量。
- 使用变量
MY_PICTURES=/c/MyPictures 创建文件globals.env
- 在
docker-compose.yml,在容器的卷部分下,安装为:- ${MY_PICTURES}:/my_pictures:ro
- 以
docker-compose --env-file global.env up开头
如果你用docker volume create创建了一个volume,那么你可以在compose的顶层volumesection中指定它,然后在每个容器中使用volume的名字加上路径和访问权限,您不会停止指定访问权限。
查看更多here,特别是
短语法使用通用的 [SOURCE:]TARGET[:MODE] 格式,其中 SOURCE 可以是主机路径或卷名。 TARGET 是挂载卷的容器路径。标准模式是只读的 ro 和读写的 rw(默认)。
这样做的下一个问题是命名卷不能绑定到特定文件夹,这与绑定挂载相反。
当您执行-v <hostPath>:<containerPath> 时,您会创建一个绑定挂载。它是挂载在容器文件系统中的主机文件系统中的特定文件夹,一切都很好,但它有一个缺点:它不能共享。
当您添加volumes 顶级选项或执行docker volume create 时,您将创建一个命名卷。命名卷是可以跨容器共享的空间,但不能绑定到主机上的特定文件夹。但是,如果您将数据写入此卷,它会保留在其中,它是一个持久卷。
所以问题是:如何用数据初始化这个卷?答案是将该卷安装在一个容器中,该容器将在该卷中写入数据。它并不优雅,而且有点令人费解,但这就是解决方案......
如何做到这一点:
在你的 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 (共享它的命名卷) 然后停止(因为它已经完成了它的主进程)
命名卷现在已初始化,可以共享给任何具有所需访问权限(ro 或 rw)的容器。
UPSIDES : 一切都在一个 docker 卷中,易于备份
缺点:数据将在卷内复制。您将获得两倍的数据量,并且除非您重做初始化,否则数据不会更新