Именованный том Docker с ориентацией на локальную папку Windows - PullRequest
0 голосов
/ 07 октября 2019

В файле docker-compose я хочу создать именованный том, который будет предназначен для локального диска в целях тестирования. Для производства мы будем использовать NFS.

Я создал файл compose следующим образом:

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

Когда я запускаю 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

Даже с ошибками он все равно создает именованный том. Поэтому, когда я проверяю это,

{
    "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"
}

Я все еще не уверен, почему точка монтирования нацеливается на это местоположение. Я знаю, что могу достичь этого без именованного тома (что я уже сделал), но для будущего проекта нам определенно нужен именованный том.

Любое предложение, как этого добиться?

1 Ответ

1 голос
/ 11 октября 2019

То же самое здесь. Используя Docker Desktop для Windows, я попытался смонтировать локальный путь E:\Project\MyWebsite\code на указанный том, но не получилось. Вот как я с этим разобрался.

Сначала я изменил путь на ".":

volumes:
    website:
        driver: local
        driver_opts:
            type: none
            device: "."
            o: bind

На этот раз docker-compose up успешно запустился, поэтому я вошел в оболочку и проверил, как выглядит смонтированный каталог:

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

Очевидно, что это не том Windows, возможно, некоторые виртуальные машины Linux, созданные Docker. Но пути /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

И это сработало! Похоже, именованный том не работает так же, как обычный способ для Windows.

Этот /host_mnt/e, вероятно, не будет существовать, если вы ранее не предоставили доступ к букве диска. Но это не должно быть проблемой для вас, поскольку вы попробовали обычный способ установки локального диска, который работал.

...