Docker на WSL. Хочу смонтировать подходящую папку на Windows 10 с WSL.

Вопрос или проблема

Я использую WSL на Windows, работая с Docker.

Я принял это решение

https://stackoverflow.com/questions/50540721/docker-toolbox-error-response-from-daemon-invalid-mode-root-docker

Поэтому я попробовал смонтировать “mounted_folder” с файлом “file_at_host” здесь через Docker на WSL. Вот так…

docker run -it -v //C/Users/<имя_пользователя>/Desktop/mounted_folder://new_dir <образ> bash 
docker run -it -v /C/Users/<имя_пользователя>/Desktop/mounted_folder:/new_dir <образ> bash

Но, как вы можете видеть на следующем изображении, команда ls не показывает никаких файлов.

Как папка смонтирована в КОНТЕЙНЕРЕ

С другой стороны, я попробовал сделать то же самое в Командной строке.

docker run -it -v C:\Users\<имя_пользователя>\Desktop\mounted_folder:/new_dir <образ> bash

Тогда я смог найти файл “file_at_host” с помощью команды ls.

Как папка смонтирована в КОНТЕЙНЕРЕ

Как такое могло произойти?

И на какую папку ссылается Docker, когда он монтирует папку?

Могу ли я найти эту папку в интерфейсе Windows?

Подобным образом, я попытался смонтировать папку через Docker с WSL и создал файл “something.ipynb” в контейнере.

docker run -p 8888:8888 -v /c/Users/<имя_пользователя>/Desktop/ds_python:/work --name my-lab <образ>

Но я не смог найти файл “something.ipynb” в интерфейсе Windows, где он должен был находиться в соответствующей папке “ds_python”.

Но я увидел, что файл “something.ipynb” существует, когда я попробовал смонтировать “Desktop” через Docker с WSL.

Как папка смонтирована в КОНТЕЙНЕРЕ

Как на картинке выше, файл “something.ipynb” появляется, хотя я не смог его найти в интерфейсе Windows “C:\Users\Desktop\ds_python”.

Как я могу разобраться с этим?

“C:\Users\Desktop” и “/c/Users/Desktop/” разные?

Тогда как я могу увидеть вторую на Windows?

И также, как мне смонтировать соответствующую папку на Windows с WSL через Docker?

Если вы используете WSL2, Windows-диски доступны на /mnt.

 ls -lah /mnt
total 12K
drwxr-xr-x 10 root   root   4.0K Nov 13 13:13 .
drwxr-xr-x 17 root   root   4.0K Dec 12 11:12 ..
drwxrwxrwx  1 sathya sathya  512 Dec  6 12:47 c
drwxrwxrwx  1 sathya sathya 4.0K Dec  2 10:31 d
drwxrwxrwx  1 sathya sathya 4.0K Dec  2 10:31 e
drwxrwxrwx  1 sathya sathya 4.0K Dec  2 10:31 f
drwxrwxrwx  1 sathya sathya  512 Dec  2 10:31 g
drwxrwxrwx  1 sathya sathya 4.0K Dec  2 10:31 h
drwxrwxrwx  2 root   root   4.0K Nov 13 13:13 i
drwxrwxrwt  2 root   root     40 Dec 12 11:12 wsl


Чтобы смонтировать ваши файлы Windows, вы должны использовать тот же формат, что и упоминалось выше, т.е. предоставить полный путь, включая ведущий /mnt как привязанный том,

docker run -it -v /mnt/c:/host/c alpine sh

С этим, ваш диск C смонтирован в /host/c в контейнере.

ls -lah /host/c

drwxrwxrwx    1 1000     1001         512 Dec 15 07:42 .
drwxr-xr-x    3 root     root        4.0K Dec 15 10:35 ..
lrwxrwxrwx    1 1000     1001          12 Sep 29  2018 Documents and Settings -> /mnt/c/Users
dr-xr-xr-x    1 1000     1001         512 Dec  9 16:54 Program Files
dr-xr-xr-x    1 1000     1001         512 Nov 13 11:03 Program Files (x86)
drwxrwxrwx    1 1000     1001         512 Nov  7 13:26 ProgramData
dr-xr-xr-x    1 1000     1001         512 Oct  2 08:39 Users
dr-xr-xr-x    1 1000     1001         512 Dec 15 07:43 Windows

Во-первых, решение Stack Overflow, которое я принял, когда указал смонтированную папку, является устаревшей информацией, и это касается Docker Toolbox, а не WSL.

Так что я обнаружил, что оно не применимо к моей ситуации.

Во-вторых, я должен указать смонтированную папку на WSL так…

docker run -it -v /mnt/c/Users/'имя_пользователя'/desktop/mounted_folder:/new_dir <образ> bash

В-третьих, если я указываю смонтированную папку так,

/c/Users/'имя_пользователя'/desktop/mounted_folder

Я могу проверить папку в интерфейсе по пути, как,

\\wsl$\Ubuntu\c\Users\'имя_пользователя'\desktop\mounted_folder

результат в проводнике

Я должен ввести \\wsl$\Ubuntu~, потому что дистрибутив WSL был Ubuntu. Хотя установлена Ubuntu-20.04.

Результат wsl --list -v

скриншот результата wsl --list -v

Если я указываю смонтированную папку так,

/mnt/c/Users/'имя_пользователя'/desktop/mounted_folder

Я могу проверить папку в интерфейсе по пути, как,

C:\Users\'имя_пользователя'\Desktop\mounted_folder

Если вы хотите проверить смонтированную папку в командной строке на Windows в первом случае, вам следует использовать PowerShell. Не Командную строку.

Ошибка в Командной строке

Запуская контейнер Docker с привязками -v, говорят, что использовать абсолютный путь хоста. Я видел ${PWD}, если использовать PowerShell, или $(pwd) для CMD. Однако я обнаружил, что это не всегда работает из-за WSL, когда Docker передает путь хоста. Например, диск C: помещается в /mnt/host, неявно под /mnt/host/c или, если у вас есть диск J:, это будет /mnt/host/j. Проведя несколько часов тестов, я нашел, что использование //c/path_to_Folder , если на c, работает лучше всего. Или другой пример //j/path_to_folder для диска J:, я обнаружил, что это работает лучше всего для привязок.

J:\

   |

   |-- new-project

      |     
      |-- data
          |
          -- index.html

docker run -d --name my-webtest -v //j/new-project/data:/usr/share/nginx/html -p 8080:80 nginx

Ответ или решение

Docker на WSL: Как смонтировать папку из Windows 10 с помощью WSL

Использование Docker в среде WSL (Windows Subsystem for Linux) предоставляет множество преимуществ для разработчиков и системных администраторов, стремящихся получить лучшую интеграцию между Windows и Linux. Однако, при работе с монтированием папок возникают некоторые нюансы, особенно когда дело касается совместимости путей и форматов. В данной статье мы подробно рассмотрим, как правильно монтировать папки из Windows в контейнер Docker, используя WSL.

1. Понимание работы монтирования в Docker под WSL

При запуске контейнера Docker и монтировании папок важно помнить, что WSL экспонирует Windows-диски по пути /mnt/<буква диска>. Например, диск C будет доступен под /mnt/c. Этот путь следует использовать для корректного монтирования папок при работе с Docker из WSL.

2. Примеры монтирования папок

Правильный синтаксис для монтирования

В частности, для монтирования папки mounted_folder, расположенной в C:\Users\<username>\Desktop, вы можете использовать следующий синтаксис:

docker run -it -v /mnt/c/Users/<username>/Desktop/mounted_folder:/new_dir <имя_образа> bash

Либо, используя альтернативный синтаксис:

docker run -it -v //c/Users/<username>/Desktop/mounted_folder:/new_dir <имя_образа> bash

Этот синтаксис позволяет Docker корректно интерпретировать путь без возникновения ошибок, связанных с неправильными путями или отсутствием доступа.

3. Отсутствие файлов в контейнере

Вы отметили, что команда ls не показывает файлов в контейнере. Причина, скорее всего, заключается в неправильном указании путей. Не используйте пути, специфичные для Windows (например, C:\Users\<username>\...), так как Docker ожидает UNIX-подобный формат. Убедитесь, что вы используете аналогичный /mnt/c/....

Отладка

Для проверки, видны ли файлы в WSL, вы можете выполнить команду:

ls -lah /mnt/c/Users/<username>/Desktop/mounted_folder

Если файлы доступны на уровне WSL, но не в контейнере, проверьте команды запуска Docker.

4. Ошибки с созданием файлов

Если вы создали файл something.ipynb в контейнере и не видите его в папке Windows, убедитесь, что правильно указали путь монтирования. Например:

docker run -p 8888:8888 -v /mnt/c/Users/<username>/Desktop/ds_python:/work --name my-lab <имя_образа>

Для доступа к созданному файлу something.ipynb, его следует либо разместить в правильной директории, либо убедиться, что вы проверяете правильный путь в Windows.

Проверка в GUI

Вы можете проверить вашу папку в Windows через проводник по следующему пути:

C:\Users\<username>\Desktop\ds_python

5. Доступ к монтируемым папкам через GUI

Как вы заметили, может возникнуть путаница между путями /mnt/c/... и C:\.... Если вы хотите открыть папку, смонтированную через WSL, используйте адрес:

\\wsl$\Ubuntu\mnt\c\Users\<username>\Desktop\mounted_folder

Это позволяет вам получить доступ к файлам, находящимся в Linux-среде, через Windows Explorer.

Заключение

Работа с Docker в WSL может быть мощным инструментом для разработчиков. Однако для успешного хранения и доступа к данным нужно понимать, как правильно монтировать и обрабатывать пути. Убедитесь, что используете правильный синтаксис и проверяйте доступность файлов на разных уровнях среды. Следуя приведенные рекомендации, вы сможете эффективно использовать Docker с WSL и избежать распространенных ошибок при работе с файловыми системами.

Оцените материал
Добавить комментарий

Капча загружается...