在docker-compose.yaml中定义卷

6tqwzwtp  于 2023-02-11  发布在  Docker
关注(0)|答案(2)|浏览(280)

我正在为我的项目写一个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._-]+$'
zzzyeukh

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/

qlzsbp2j

qlzsbp2j2#

正如@HansKilian提到的,您不需要同时使用volumesservices.volumes。要使用services.volumes,请将主机目录Map到容器目录,如下所示:

services:
  db:
    image: db
    volumes:
      - /host/path/lib/db:/container/path/lib/db

这样,主机上的目录/host/path/lib/db将由容器使用,并在/container/path/lib/db中可用。
现在,如果您像我一样,我真的会对伪示例感到困惑,那么假设主机上的真实目录是/var/lib/db,当您在Docker中运行shell时,您只想在/db中看到它(即docker exec -it /bin/bash container-id)。
docker-compose.yaml将如下所示:

services:
  db:
    image: db
    volumes:
      - /var/lib/db:/db

现在,当您运行shell cd /logsls时,您将看到与在主机上运行cd /var/lib/db相同的结果。
如果你想使用volumes部分来指示要使用的全局卷,你首先必须使用docker volume create来创建那个卷。Hans链接的文档包含了完成这个操作的步骤。/host/path:/container/path的语法被volume-name:/container/path所取代。然后,一旦定义好了,你就可以修改你的docker-compose.yaml,使之更像这样:

services:
  db:
    image: db
    volumes:
      - your-global-volume-name:/db

volumes:
  your-global-volume-name:
    external: true

请注意,我没有测试或使用这个配置。我假设它是正确的,基于其他方法的工作和一些变化,我可以在文档中确定。

相关问题