WSL1, Docker Desktop, тома монтируются всегда пусто - PullRequest
0 голосов
/ 06 февраля 2020

Я следовал этой настройке полностью. Запуск WSL1 с Docker Desktop на Windows 10. На данный момент меня не интересует WSL2. У меня нет Insider Windows.

Теперь я пытаюсь запустить контейнер с томом, чтобы файлы контейнера были скопированы в том. Согласно официальным документам :

Заполните том с помощью контейнера

Если вы запускаете контейнер, который создает новый том, как указано выше, и контейнер имеет файлы или каталоги в каталоге для монтирования (например, / app / вышеуказанный), содержимое каталога копируется в том.

Так что это должно быть возможно, но я должен упустить что-то действительно c здесь, потому что это просто не работает.

Я пробовал -v vol-name:/path/on/container -> это создает именованный том ... где-то. Понятия не имею, где и как это просмотреть. Выполнение volume inspect vol-name показывает путь, который не существует ни в WSL, ни в Docker Host (Windows). Я даже пытался смонтировать MobyVM, но его там тоже нет.

Я пробовал -v /c/full/path:/path/on/container -> это создает монтирование типа привязки. Это пусто (по замыслу). Если он поместит файлы под /c/full/path, я увижу их в контейнере под /path/on/container, но это не то, что мне нужно. Мне нужно заполнить том содержимым из контейнера. Из того, что я понимаю из документов, мне нужно монтирование типа тома, а не монтирование типа связывания. В этом случае опции -v принудительно устанавливают тип привязки

Я пробовал --mount type=volume,source=/c/full/path,destination=/path/on/container -> Это приводит к error: docker: Error response from daemon: create /c/full/path: "/c/full/path" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path. Разделитель пути не разрешен ...

I Я прочитал кое-что о специальных символах в паролях, которые являются проблемой, и сбросил свой пароль. Я прочитал о том, что / c / full / path требуется разрешение на полный доступ, и дал «каждому» полный доступ

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Я думаю, что у меня те же настройки, что и у вас: windows 10, WSL1, docker рабочий стол 2.2.0.0 (42247)

➜  uname -a
Linux LAPTOP1001 4.4.0-17134-Microsoft #1130-Microsoft Thu Nov 07 15:21:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
➜  lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:        18.04
Codename:       bionic

Мне удалось выполнить те же операции, что и вы , я сделал это следующим образом, используя alpine:

➜  docker volume create my-vol
my-vol
➜  docker volume ls
DRIVER              VOLUME NAME
local               my-vol
➜  docker volume inspect my-vol
[
    {
        "CreatedAt": "2020-02-07T11:06:15Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]
➜  docker run -it --name volTest --mount source=my-vol,target=/my-vol alpine
/ # cd my-vol
/my-vol # ls
/my-vol # exit
➜  docker run -it --name volTest2 --mount source=my-vol,target=/usr/bin alpine
/ # cd /usr/bin/
/usr/bin # ls -al
total 228
drwxr-xr-x    2 root     root          4096 Feb  7 11:16 .
drwxr-xr-x    7 root     root          4096 Jan 16 21:52 ..
lrwxrwxrwx    1 root     root            12 Jan 16 21:52 [ -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan 16 21:52 [[ -> /bin/busybox
...
...
/usr/bin # exit 
➜  docker container start volTest
volTest
➜  docker container attach volTest
/ # cd /my-vol/
/my-vol # ls
total 228
drwxr-xr-x    2 root     root          4096 Feb  7 11:16 .
drwxr-xr-x    7 root     root          4096 Jan 16 21:52 ..
lrwxrwxrwx    1 root     root            12 Jan 16 21:52 [ -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan 16 21:52 [[ -> /bin/busybox
...
...
/my-vol # exit
➜ 
  1. Во-первых, я создаю том my-vol и проверяю его
  2. Во-вторых, my-vol прикреплен к root контейнера myTest, когда вы смотрите внутри тома, он пуст
  3. Затем присоедините my-vol к другому контейнеру с именем myTest2, но в папке / usr / bin, которая, как вы можете видеть, содержит много файлов.
  4. Теперь, перезапустив myTest, вы увидите, что том заполнен файлами из / usr / bin из контейнера myTest2

Можете ли вы повторить мои результаты в вашей системе? Приветствия

0 голосов
/ 06 февраля 2020

Позвольте мне обобщить то, что я думаю о ваших настройках, тогда я попытаюсь дать решение.

  • Вы используете docker рабочий стол для docker движка
  • Вы подключаетесь к docker рабочему столу через docker cli, установленный на WSL
  • Вы пытаетесь открыть общий доступ к папке windows с работающим контейнером
  • Вы включили общий доступ к своему C диск в настройках docker рабочий стол

Я думаю, что вы ссылаетесь на неправильный путь, указанный вами путь должен быть распознан docker рабочим столом, который запоминается, работает в windows, поэтому путь должен быть в формате c:/full/path.

Поэтому попробуйте следующее, чтобы проверить, правильно ли все настроено

➜  cd /mnt/c
➜  mkdir -p full/path
➜  cd full/path
➜  pwd
/mnt/c/full/path
➜  docker image pull alpine
Using default tag: latest
latest: Pulling from library/alpine
Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Status: Image is up to date for alpine:latest
docker.io/library/alpine:latest
➜  date > foobar.txt
➜  cat foobar.txt
Thu Feb  6 17:49:31 STD 2020
➜  docker run --rm -v c:/full/path:/full/path alpine cat /full/path/foobar.txt
Thu Feb  6 17:49:31 STD 2020
➜  

до конца sh Вы можете использовать wslpath вместе с pwd, чтобы получить текущий каталог в форме, которая docker рабочий стол можно использовать.

docker run --rm -v $(wslpath -w $(pwd)):/full/path alpine ls /full/path/

Надеюсь, это поможет

...