想象一下,我有一个包含一些静态数据的Docker容器。
现在出于开发目的,我希望将容器目录/resources
的内容安装到我的本地工作目录.
。
码头工人,compose.yml:
version: '3.2'
services:
resources:
image: <private_registry>/resources:latest
volumes:
- ./resources:/resources
运行docker-compose up
时,在我的工作目录中创建了文件夹resources
,它没有内容,而容器中有/resources/
中的内容
使用命名卷并检查它时,它的工作方式与预期的一样。
Docker在特定场景中将卷源初始化为图像内容:
您目前仍处于第一个要求,但可以使用执行绑定装入的命名卷将主机中的任何文件夹映射到容器中。以下是三种不同方法的示例:
# 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不会为您创建它。
这里有几件事。首先,当您挂载主机目录时,它会“遮挡”给定路径上的任何现有内容,从而有效地将其替换为挂载的内容。因此,主机上的资源目录隐藏了容器中的所有内容。
你的问题没有简单的解决方案。当我想编辑容器和主机上的文件时,我将文件保存在主机上并将它们安装在容器中。如果我想要一个容器的副本,我将主机目录挂载到容器中的另一个目录,并安排复制文件。