【问题标题】:Named volume with local bind defined in docker compose not working but working when externally defined在 docker compose 中定义的具有本地绑定的命名卷不工作,但在外部定义时工作
【发布时间】:2021-12-12 18:38:22
【问题描述】:

我想在我的 docker compose 文件中使用一个命名卷,它绑定到主机中的用户定义路径。似乎应该是可能的,因为我在网上看到了多个示例,其中一个是 How can I mount an absolute host path as a named volume in docker-compose?

所以,我也想做同样的事情。请记住,这只是一个示例,我有一个用例,我想将命名卷用于 DRYness。

注意:我正在使用带有 WSL2 的 Docker for Windows

version: '3'

services:
  example:
    image: caddy
    restart: unless-stopped
    volumes:
      - caddy_data:/data
      - ./Caddyfile:/etc/caddy/Caddyfile

volumes:
  caddy_data:
    name: caddy_data
    driver_opts:
      o: bind
      device: D:\Some\path_in\my\host
      type: none

# volumes:
#   caddy_data:
#     external: true
#     name: caddyvol

这不起作用,每次我做docker compose up -d 我都会收到错误:

[+] Running 1/2
 - Volume "caddy_data"                Created                                                                                                                                                                                                                           0.0s
 - Container project-example-1  Creating                                                                                                                                                                                                                          0.9s
Error response from daemon: failed to mount local volume: mount D:\Some\path_in\my\host:/var/lib/docker/volumes/caddy_data/_data, flags: 0x1000: no such file or director

但如果我首先使用创建卷

docker volume create --opt o=bind --opt device=D:\Some\path_in\my\host --opt type=none caddyvol

然后在我的 docker compose 文件中使用上面的内容(参见上面文件的注释部分),它可以完美运行。

我什至尝试查看创建的卷之间的差异,但没有发现

docker volume inspect caddy_data

[
    {
        "CreatedAt": "2021-12-12T18:19:20Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "ngrok-compose",
            "com.docker.compose.version": "2.2.1",
            "com.docker.compose.volume": "caddy_data"
        },
        "Mountpoint": "/var/lib/docker/volumes/caddy_data/_data",
        "Name": "caddy_data",
        "Options": {
            "device": "D:\\Some\\path_in\\my\\host",
            "o": "bind",
            "type": "none"
        },
        "Scope": "local"
    }
]

docker volume inspect caddyvol

[
    {
        "CreatedAt": "2021-12-12T18:13:17Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/caddyvol/_data",
        "Name": "caddyvol",
        "Options": {
            "device": "D:\\Some\\path_in\\my\\host",
            "o": "bind",
            "type": "none"
        },
        "Scope": "local"
    }
]

你知道这里出了什么问题吗?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    感谢有人指出了我一半的错误,终于设法弄清楚了。在 compose 文件中定义卷时,设备应采用 linux 路径格式不带驱动器名称后的:。此外,版本号应完全定义。因此,在示例情况下,它应该是

    version: '3.8'
    
    services:
      example:
        image: caddy
        restart: unless-stopped
        volumes:
          - caddy_data:/data
          - ./Caddyfile:/etc/caddy/Caddyfile
    
    volumes:
      caddy_data:
        name: caddy_data
        driver_opts:
          o: bind
          device: d/Some/path_in/my/host
          type: none
    

    但这仍然不起作用。而且它似乎不仅仅在 Windows Docker Desktop 中工作。所以,我进入\\wsl.localhost\docker-desktop-data\version-pack-data\community\docker\volumes,检查了手动创建的卷和从撰写文件生成的卷之间的区别。

    唯一的区别在于 opts.json 文件中每个的 MountDevice 键。手动创建的文件在提供的路径中附加了/run/desktop/mnt/host/。因此,我将撰写文件更新为

    version: '3.8'
    
    services:
      example:
        image: caddy
        restart: unless-stopped
        volumes:
          - caddy_data:/data
          - ./Caddyfile:/etc/caddy/Caddyfile
    
    volumes:
      caddy_data:
        name: caddy_data
        driver_opts:
          o: bind
          device: /run/desktop/mnt/host/d/Some/path_in/my/host
          type: none
    

    这成功了!

    【讨论】:

    • 所以您实际上在 \\wsl.localhost\docker-desktop-data\version-pack-data\community\docker\volumes 中创建了 /run/desktop/mnt/host/?因为我遇到了同样的问题
    猜你喜欢
    • 2021-01-14
    • 2012-01-13
    • 2019-07-15
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多