Докер в WSL не будет связывать mount $HOME
У меня самая странная ситуация с использованием Docker на WSL (Подсистема Windows для Linux, Ubuntu 16.04). Я пытаюсь привязать гору /home/username
(или просто $HOME
для удобства) как том в контейнере, и вместо того, чтобы находить содержимое моего домашнего каталога в контейнере, я полностью получаю другой том.
Что более странно, так это то, что этот "другой том" сохраняется из одного контейнера в другой всякий раз, когда я пытаюсь связать mount $HOME
или же /home/username
, Если я touch
новый файл, он появляется во всех других контейнерах, которые я монтирую $HOME
в. Все остальные привязки к любому другому каталогу работают правильно.
Например, все они находятся в одной папке:
docker run -it --rm -v /home/username:/test alpine sh
docker run -it --rm -v $HOME:/test alpine sh
docker run -it --rm -v $HOME:/test -v $HOME:/test2 alpine sh
Когда я делаю docker volume ls
Там нет громкости называется /home/username
, так что исключает случайное наличие тома, размещенного на докере, с тем же именем.
Что это за таинственный том, который я монтирую, и почему докер не монтирует мой $HOME
каталог правильно?
1 ответ
Я использовал инструкции в https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly, чтобы настроить все.
Тогда я должен был явно export HOME=/c/Users/rfay
чтобы демон Docker в Windows мог получить к нему доступ. Но это сработало. Основная магия заключается в том, что ваш путь в WSL должен быть чем-то, что демон Docker может перевести в родную Windows.
Нет необходимости менять точку наклона, как предлагает @rfay. Скорее, если вы используете небольшую команду foo, вы можете использовать pwd и sed, чтобы зафиксировать значение для вас.
docker run -it -v $(pwd | sed 's/^\/mnt//'):/var/myfolder -w "/var/myfolder" centos:7
pwd вернет текущую рабочую папку, обычно в формате "/ mnt / c / code / myfolder". Передав это в sed и заменив '/ mnt' ничем, вы оставите такой путь, как '/ c / code / myfolder', который является желаемым путем для докера для окон. вам нужно обернуть все это в $(), чтобы выполнить его на месте.
Я считаю, что это работает очень хорошо.