首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在docker中定义了本地绑定的命名卷不工作,而是在外部定义时工作。

在docker中定义了本地绑定的命名卷不工作,而是在外部定义时工作。
EN

Stack Overflow用户
提问于 2021-12-12 18:38:22
回答 1查看 2.3K关注 0票数 1

我希望在我的停靠器撰写文件中使用一个命名卷,该文件绑定到主机中的用户定义路径。这似乎是可能的,因为我已经在网上看到了多个例子,其中之一就是How can I mount an absolute host path as a named volume in docker-compose?

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

注意:我在WSL2中使用

代码语言:javascript
复制
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时,我都会得到错误:

代码语言:javascript
复制
[+] 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

但是如果我首先使用

代码语言:javascript
复制
docker volume create --opt o=bind --opt device=D:\Some\path_in\my\host --opt type=none caddyvol

然后在我的docker撰写文件中使用上面的内容(请参阅上面文件的注释部分),它工作得很完美。

我甚至试图找出所创建的卷之间的区别,但却没有发现。

docker volume inspect caddy_data

代码语言:javascript
复制
[
    {
        "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

代码语言:javascript
复制
[
    {
        "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"
    }
]

有什么想法吗?这里怎么了?

EN

回答 1

Stack Overflow用户

发布于 2021-12-16 15:34:08

最后,由于有人指出了我一半的错误,我终于想出了答案。在编写文件中定义卷时,设备应该是linux路径格式的,而不需要在驱动器名之后使用-- :。此外,版本号应该完全定义。所以,在这个例子中,应该是

代码语言:javascript
复制
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

但这还是行不通的。而且它似乎并不只适用于。因此,我进入了\\wsl.localhost\docker-desktop-data\version-pack-data\community\docker\volumes,检查了手动创建的卷与从复合文件生成的卷之间的差异。

唯一的区别是每个opts.json文件中的opts.json键。手动创建的文件已将/run/desktop/mnt/host/附加到所提供的路径。所以,我更新了我的撰写文件

代码语言:javascript
复制
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

这起作用了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70326574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档