Докер, встановлений у Docker, додає; C до кінця шляху Windows при перекладі зі шляху стилю Linux


88

Я виявив деякі цікаві дивацтва при спробі встановити образ докера на вікна.

Я створив .shсценарій, який виконує монтування папки проекту для запуску нашого образу середовища розробника. Я хочу один сценарій, який може запускати кожен розробник, незалежно від його машини. Все, що він робить, це запускає docker із поточною папкою проекту.

#!/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.

Ват. Що ;Cі звідки воно взялося?

Тож я роблю те, echo $PWDщо дає мені /d/my/project/folder.

Цікаво, тому $PWDвирішує правильний шлях у форматі Linux path, і, схоже, докер намагається перевести з нього на правильний шлях до Windows, за винятком того, що це ;Cз’являється з нізвідки. І \це /...

Що саме тут відбувається?

Я отримую той самий результат у терміналі git bash і PowerShell VSCode.

Оновлення: Я помітив, що запуск .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 Врешті-решт я виявив, що мені довелося використовувати провідну скісну риску з дужками замість дужок. Крім того, з робочим каталогом мені знадобилися дві провісні скісні риски. FYI: це команда, потрібна мені для Docker для веб-розробників на Pluralsight
Andy2K11

Це спрацювало для мене (у Windows 10 git bash): запуск докера --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. Дякую.
Емілі

ЖИТТЯ. ЕКОНОМІКА. +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):

запуск контейнера докера - ім'я контейнера-ім'я -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.