Добавлен том, смонтированный в Docker; C в конец пути Windows при переводе из пути в стиле Linux


88

Я обнаружил некоторые интересные странности, пытаясь смонтировать образ докера в Windows.

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

#!/usr/bin/env bash
docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev

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

docker run -it --rm -v $PWD:/wkDir $IMAGE_TAG yarn dev

Не работает с:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from 
daemon: Mount denied:
The source path "D:/my/project/folder;C"
doesn't exist and is not known to Docker.

Wat. Что ;Cи откуда взялось?

Так что я делаю то, echo $PWDчто дает мне /d/my/project/folder.

Интересно, поэтому $PWDразрешается правильный путь в формате пути Linux, и кажется, что докер пытается перевести с него на правильный путь Windows, за исключением того, что это ;Cпоявляется из ниоткуда. И \они /...

Что именно здесь происходит?

Я получаю тот же результат в терминале VSCode git bash и powershell.

Обновление: я заметил, что .shпри запуске в терминале PowerShell VSCode открывается отдельное cmd.exeокно консоли, которое, кажется, запускает скрипт в git bash. Так что это может быть проблема с git bash.

Ответы:


125

Итак, немного покопавшись, я нашел эти три потока, связанных с git-bash, убирающим монтирование докеров:

https://forums.docker.com/t/weird-error-under-git-bash-msys-solved/9210 https://github.com/moby/moby/issues/24029#issuecomment-250412919

Когда я просматриваю документацию mingw по преобразованию пути, которое использует git-bash, я нахожу эту таблицу синтаксиса: http://www.mingw.org/wiki/Posix_path_conversion

Один из которых выводит в формате: x;x;C:\MinGW\msys\1.0\x. Обратите внимание на ;Cэто. Если git-bash пытается быть умным, набивая синтаксис и выводя путь в этом формате, это объяснит это.

Решение состоит в том, чтобы избежать преобразования пути с помощью префикса /. Итак, рабочая команда docker для запуска docker из git-bash с текущим рабочим каталогом:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev

9
Я обнаружил, что мне нужно дополнительно обернуть путь в строку так"/${PWD}"
Bananaapple

11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start В конце концов я обнаружил, что мне пришлось использовать ведущую косую черту со скобками вместо фигурных скобок. Кроме того, для рабочего каталога мне потребовались две ведущие косые черты. К вашему сведению: это команда, которая мне нужна для Docker для веб-разработчиков на Pluralsight
Andy2K11

Это сработало для меня (в Windows 10 git bash): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa

1
Спасение жизни. Здесь Windows10 и git-bash, я долго пытался монтировать том без использования docker-compose, пока я не увижу этот пост. Сейчас это работает: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Спасибо.
Emily

ЖИЗНЬ. SAVER. +1000000
Джонатан Тузман

3

Для меня решением было просто включить закрывающую косую черту /в конце любого пути .

Например, вместо

/opt/apache-atlas-2.0.0/bin/atlas_start.py

... использовать

/opt/apache-atlas-2.0.0/bin/atlas_start.py/


3

Монтирование текущего каталога в контейнер Docker в Windows 10 из Git Bash (MinGW) может завершиться ошибкой из-за преобразования пути POSIX. Любой путь, начинающийся с /, преобразуется в действительный путь Windows.

touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# ls: C:/Git/data/test.txt: No such file or directory

Избегайте путей POSIX с помощью префикса /

Чтобы пропустить преобразование пути, все пути POSIX должны иметь префикс с дополнительной косой чертой ( /), включая /$(pwd).

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 //data/test.txt

В Git Bash путь //data/test.txtне преобразуется, а в оболочках Linux //(ведущая двойная косая черта) игнорируется и обрабатывается так же, как /.

Отключить преобразование пути

Отключите преобразование пути POSIX в Git Bash (MinGW) с помощью MSYS_NO_PATHCONVпеременной среды.

Преобразование пути можно отключить на командном уровне:

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

Преобразование пути можно отключить на уровне оболочки (или системы):

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

2
Спасибо за предоставление этого решения, так как у меня не сработало экранирование, в то время как отключение преобразования пути сработало.
Чанандлер Бонг,


0

У меня действительно была такая же проблема. В зависимости от того, используете ли вы Git Bash, эта команда работает (на примере nginx):

docker container run --name имя-контейнера -v `pwd -W` / html: / usr / share / nginx / html -p 8000: 80 -d nginx

конечно, вы можете указать порт и каталог по своему желанию.


0

У меня была такая же проблема с git bash, а не с командной строкой. Вместо этого ты можешь

docker run -it --rm -v "/${PWD}/D:\my\project\folder":/wkDir $IMAGE_TAG yarn dev

0

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

docker run --rm -u root -p 8080:8080 -v jenkins-data/:/var/jenkins_home -v /var/run/docker.sock/:/var/run/docker.sock -v /Users/<YOUR USER NAME>/:/home jenkinsci/blueocean
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.