Вопрос или проблема
Я использую WSL на Windows, работая с 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
Если я указываю смонтированную папку так,
/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 и избежать распространенных ошибок при работе с файловыми системами.