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 找到):
使用环境变量。
- 使用变量
MY_PICTURES=/c/MyPictures
创建一个文件 globals.env
- 在
docker-compose.yml
中,在容器的卷部分下,安装为:- ${MY_PICTURES}:/my_pictures:ro
- 从
docker-compose --env-file global.env up
开始
如果您使用 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 (共享它的指定卷) 然后停止 (因为它已完成其主要进程)
命名卷现已初始化,可以共享给任何具有所需访问权限(ro
或 rw
)的容器。
UPSIDES : 一切都在 docker 卷中,易于备份
缺点:数据将在卷内复制。你会得到两倍相同数量的数据,除非你重新初始化,否则数据不会更新
我是 运行 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 找到):
使用环境变量。
- 使用变量
MY_PICTURES=/c/MyPictures
创建一个文件 - 在
docker-compose.yml
中,在容器的卷部分下,安装为:- ${MY_PICTURES}:/my_pictures:ro
- 从
docker-compose --env-file global.env up
开始
globals.env
如果您使用 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 (共享它的指定卷) 然后停止 (因为它已完成其主要进程)
命名卷现已初始化,可以共享给任何具有所需访问权限(ro
或 rw
)的容器。
UPSIDES : 一切都在 docker 卷中,易于备份 缺点:数据将在卷内复制。你会得到两倍相同数量的数据,除非你重新初始化,否则数据不会更新