在 docker-compose.yaml 中定义卷

define volumes in docker-compose.yaml

我正在为我的项目写一个 docker-compose.yaml 文件。我已经检查了卷文档 here .

我也理解 docker 中 volume 的概念,我可以挂载一个卷,例如-v my-data/:/var/lib/db 其中 my-data/ 是我主机上的目录,而 /var/lib/db 是数据库容器内的路径。

我对上面的 link 感到困惑。它有以下示例:

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: 部分,我不确定卷名应该是我的目录路径还是应该只是我给的字面上的名字 & 如果是后者case 那么如何在我的机器上用 temp/my-data/ 映射给定名称?该示例并未表明 & 有歧义以澄清这一点。

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

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._-]+$'

映射卷可以是主机上的 files/directories(有时在文档中称为 bind mounts),也可以是可以使用 [=11= 管理的 docker 卷] 命令。

docker-compose 文件中的 volumes: 部分指定 docker 卷,即不是 files/directories。您的 post 中的第一个 docker-compose 使用了这样的卷。

如果你想映射一个文件或目录(就像你上一个 docker-compose 文件),你不需要在 volumes: 部分指定任何内容。

Docker 卷(在 volumes: 部分中指定或使用 docker volume create 创建的卷)当然也存储在您的主机上的某个地方,但 docker 管理那你通常不需要知道格式在哪里或什么。

这部分文档解释的很好,我觉得https://docs.docker.com/storage/volumes/