我正在为我的项目写一个docker-compose.yaml
文件。我已经检查了这里的卷文档。
我也理解docker中volume
的概念,我可以挂载一个卷,例如-v my-data/:/var/lib/db
,其中my-data/
是我的主机上的目录,而/var/lib/db
是数据库容器内的路径。
我的困惑是我上面的链接。它有以下的例子:
version: "3.9"
services:
db:
image: db
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
data-volume:
我想知道这是否意味着我必须在我的主机上创建一个名为data-volume
的目录?如果我的机器上有一个路径为temp/my-data/
的目录,并且我想将该路径挂载到数据库容器/var/lib/db
,我应该执行以下操作吗?
version: "3.9"
services:
db:
image: db
volumes:
- temp/my-data/:/var/lib/db
volumes:
temp/my-data/:
我的主要困惑是底部的volumes:
部分,我不确定卷名应该是我的目录路径还是应该只是我给予的一个名字&如果是后一种情况,那么给定的名字如何与我的机器上的temp/my-data/
Map?示例没有指出&为了澄清这一点,它是模棱两可的。
有人能给我解释一下吗?
**P.S.**我尝试了上面的docker-compose我猜,结束了错误:
ERROR: The Compose file './docker-compose.yaml' is invalid because:
volumes value 'temp/my-data/' does not match any of the regexes: '^[a-zA-Z0-9._-]+$'
2条答案
按热度按时间zzzyeukh1#
Map卷可以是主机上的文件/目录(在文档中有时称为
bind mounts
),也可以是可以使用docker volume
命令管理的Docker卷。docker-compose文件中的
volumes:
部分指定了docker卷,即不是文件/目录。您的第一篇文章中的docker-compose使用了这样的卷。如果你想Map一个文件或目录(就像你上一个docker-compose文件),你不需要在
volumes:
部分指定任何东西。Docker卷(在
volumes:
部分中指定的卷或使用docker volume create
创建的卷)当然也存储在主机上的某个地方,但是docker管理这些卷,通常您不需要知道它们的位置或格式。这部分文档很好地解释了它,我认为https://docs.docker.com/storage/volumes/
qlzsbp2j2#
正如@HansKilian提到的,您不需要同时使用
volumes
和services.volumes
。要使用services.volumes
,请将主机目录Map到容器目录,如下所示:这样,主机上的目录
/host/path/lib/db
将由容器使用,并在/container/path/lib/db
中可用。现在,如果您像我一样,我真的会对伪示例感到困惑,那么假设主机上的真实目录是
/var/lib/db
,当您在Docker中运行shell时,您只想在/db
中看到它(即docker exec -it /bin/bash container-id
)。docker-compose.yaml
将如下所示:现在,当您运行shell
cd /logs
和ls
时,您将看到与在主机上运行cd /var/lib/db
相同的结果。如果你想使用
volumes
部分来指示要使用的全局卷,你首先必须使用docker volume create
来创建那个卷。Hans链接的文档包含了完成这个操作的步骤。/host/path:/container/path
的语法被volume-name:/container/path
所取代。然后,一旦定义好了,你就可以修改你的docker-compose.yaml
,使之更像这样:请注意,我没有测试或使用这个配置。我假设它是正确的,基于其他方法的工作和一些变化,我可以在文档中确定。