具有目标 Windows 本地文件夹的 Docker 命名卷

Ser*_*dar 4 containers docker docker-swarm

在 docker-compose 文件中,我想创建一个命名卷,该卷将针对本地驱动器进行测试。对于生产,我们将使用 NFS。

我创建的撰写文件如下,

version: '3.3'
services:

  test:
    build: .
    volumes:
      - type: volume
        source: data_volume
        target: /data
    networks:
      - network

volumes:
  data_volume:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: c:/data

networks:
  network:
    driver: overlay
    attachable: true
Run Code Online (Sandbox Code Playgroud)

当我运行 docker-compose up 时,出现以下错误,

for test_test_1  Cannot create container for service test: failed to mount local volume: 
mount c:/data:/var/lib/docker/volumes/test_data_volume/_data, flags: 0x1000: no such file 
or directory
Run Code Online (Sandbox Code Playgroud)

即使有错误,它仍然会创建命名卷。所以当我检查它时,

{
    "CreatedAt": "2019-10-07T09:10:14Z",
    "Driver": "local",
    "Labels": {
        "com.docker.compose.project": "test",
        "com.docker.compose.version": "1.24.1",
        "com.docker.compose.volume": "data_volume"
    },
    "Mountpoint": "/var/lib/docker/volumes/test_data_volume/_data",
    "Name": "test_data_volume",
    "Options": {
        "device": "c:/data",
        "o": "bind",
        "type": "none"
    },
    "Scope": "local"
}
Run Code Online (Sandbox Code Playgroud)

我仍然不确定为什么 Mountpoint 将目标定位到该位置。我知道我可以在没有命名卷的情况下实现这一点(我已经这样做了),但是对于项目的未来,我们肯定需要命名卷。

任何建议如何实现这一目标?

Edm*_*Tam 9

同样在这里。使用适用于 Windows 的 Docker 桌面,我尝试将本地路径挂载E:\Project\MyWebsite\code到命名卷,但失败了。这是我如何解决这个问题的。

首先,我将路径更改为“.”:

volumes:
    website:
        driver: local
        driver_opts:
            type: none
            device: "."
            o: bind
Run Code Online (Sandbox Code Playgroud)

这次docker-compose up成功运行,所以我登录到shell并检查挂载目录的样子:

bash-5.0# ls -l
total 62
lrwxrwxrwx    1 root     root            11 Oct  1 15:15 E -> /host_mnt/e
drwxr-xr-x    2 root     root         14336 Sep 11 15:27 bin
drwxr-xr-x    4 root     root          2048 Apr 19  2017 dev
lrwxrwxrwx    1 root     root            11 Oct  1 15:15 e -> /host_mnt/e
drwxr-xr-x    1 root     root           180 Sep 30 11:53 etc
drwxr-xr-x    2 root     root          2048 Sep 11 15:27 home
drw-r--r--    4 root     root            80 Oct  8 22:52 host_mnt
drwxr-xr-x    1 root     root            60 Sep 30 11:53 lib
drwxr-xr-x    5 root     root          2048 Sep 11 15:27 media
...
drwxrwxrwt    1 root     root            40 Oct 11 19:37 tmp
drwxr-xr-x    1 root     root            80 Sep 11 15:27 usr
drwxr-xr-x   13 root     root          2048 Sep 11 15:27 var
Run Code Online (Sandbox Code Playgroud)

显然不是 Windows 卷,可能是一些由 Docker 创建的 Linux VM。但是路径/host_mnt/e/host_mnt/E似乎具有指示性,所以我尝试将docker-compose定义更改为:

volumes:
    website:
        driver: local
        driver_opts:
            type: none
            device: "/host_mnt/e/Project/MyWebsite/code"
            o: bind
Run Code Online (Sandbox Code Playgroud)

它奏效了!看起来命名卷与 Windows 的顺序方式不同。

/host_mnt/e除非您之前已授予对驱动器号的访问权限,否则这可能不存在。但这对您来说应该不是问题,因为您已经尝试了安装可以工作的本地驱动器的顺序方式。

  • 这不会剥夺 docker-compose 的可移植性吗?从现在开始每个人都应该使用那条确切的路径 (2认同)