在docker compose中定义了本地绑定的命名卷不工作,但在外部定义时工作



我想在docker compose文件中使用一个命名卷,该文件绑定到主机中用户定义的路径。这似乎是可能的,因为我在网上看到了多个例子,其中一个是如何在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:Somepath_inmyhost
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:Somepath_inmyhost:/var/lib/docker/volumes/caddy_data/_data, flags: 0x1000: no such file or director

但是如果我首先使用创建卷

docker volume create --opt o=bind --opt device=D:Somepath_inmyhost --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"
}
]

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

多亏有人指出了我一半的错误,终于弄明白了。在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.localhostdocker-desktop-dataversion-pack-datacommunitydockervolumes,检查手动创建的卷和从compose文件生成的卷之间的差异。

唯一的区别在于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

这起到了作用!

最新更新