在 docker-compose.yaml 中定义卷

use*_*225 21 docker docker-compose docker-volume

我正在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:
Run Code Online (Sandbox Code Playgroud)

我想知道这是否意味着我必须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/:
Run Code Online (Sandbox Code Playgroud)

我的主要困惑是volumes:底部的部分,我不确定卷名是否应该是我的目录的路径,或者应该只是我给出的字面名称,如果是后一种情况,那么给定的名称如何映射temp/my-data/在我的机器上?该示例并未表明 & 含糊不清,以澄清这一点。

有人可以帮我澄清一下吗?

PS我尝试使用上面的 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._-]+$'
Run Code Online (Sandbox Code Playgroud)

Han*_*ian 14

映射卷可以是主机上的文件/目录(有时bind mounts在文档中称为),也可以是可以使用docker volume命令管理的 docker 卷。

docker-compose 文件中的部分volumes:指定 docker 卷,即不是文件/目录。您帖子中的第一个 docker-compose 使用这样的卷。

如果您想映射文件或目录(例如在上一个 docker-compose 文件中),则无需在该volumes:部分中指定任何内容。

Docker 卷(在本节中指定的volumes:或使用 创建的docker volume create)当然也存储在主机上的某个位置,但 docker 对其进行管理,并且您通常不需要知道位置或格式是什么。

文档的这一部分很好地解释了它,我认为https://docs.docker.com/storage/volumes/


ran*_*ndy 9

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

services:
  db:
    image: db
    volumes:
      - /host/path/lib/db:/container/path/lib/db
Run Code Online (Sandbox Code Playgroud)

这样,/host/path/lib/db主机上的目录将由容器使用并可在/container/path/lib/db.

现在,如果您像我一样,我对虚假示例感到非常困惑,所以假设您主机上的真实目录是,并且您只想在 Docker 中运行 shell 时/var/lib/db查看它(即)。/dbdocker exec -it /bin/bash container-id

docker-compose.yaml看起来像这样:

services:
  db:
    image: db
    volumes:
      - /var/lib/db:/db
Run Code Online (Sandbox Code Playgroud)

现在,当您运行 shellcd /logs和 时ls,您将看到与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
Run Code Online (Sandbox Code Playgroud)

请注意,我尚未测试或使用此配置。我假设它是正确的,基于其他有效的方法以及我在文档中可以识别的一些更改。