Змонтуйте поточний каталог як том у Docker в Windows 10


132

Опис

Я використовую Docker версії 1.12.5 для Windows 10 через Hyper-V і хочу використовувати виконувані файли контейнерів як команди в поточному шляху. Я створив зображення Docker, яке працює нормально, але у мене є проблема встановити поточний шлях. Ідея полягає в тому, щоб створити псевдонім і виконати docker run --rm [...]команду, щоб його можна було використовувати в масштабах системи в поточному каталозі.

Налаштування

У мене диск E з папкою "test", а там папка під назвою "папка на хості Windows", щоб показати, що команда працює. Dockerfile створює каталог /data, визначає його як VOLUME і WORKDIR.

Маючи E:\testяк поточний каталог в PowerShell і виконуючи команду Docker з абсолютним шляхом, я можу побачити вміст E:\test:

PS E:\test> docker run --rm -it -v E:\test:/data mirkohaaser/docker-clitools ls -la
total 0
drwxr-xr-x 2 root root 0 Jan  4 11:45 .
drwxr-xr-x 2 root root 0 Jan  5 12:17 folder on windows host

Проблема

Я хочу використовувати поточний каталог, а не абсолютне позначення. Я не міг використовувати pwd у томі через різні повідомлення про помилки:

Спроба з ($ pwd)

PS E:\test> docker run --rm -it -v ($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: ":/data" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Спроба з / ($ pwd)

PS E:\test> docker run --rm -it -v /($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: "E:\\test" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Спроба з \ ´pwd \ ´

PS E:\test> docker run --rm -it -v ´$pwd´:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: Invalid bind mount spec "´E:\\test´:/data": invalid mode: /data.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Спробуйте з `pwd`

PS E:\test> docker run --rm -it -v `$pwd`:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: create $pwd: "$pwd" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Який правильний синтаксис монтажу поточного каталогу як тома в Docker в Windows 10?

Відповіді:


308

У командному рядку Windows ( cmd) ви можете змонтувати поточний каталог так:

docker run --rm -it -v %cd%:/usr/src/project gcc:4.9

У PowerShell ви використовуєте ${PWD}, що дає вам поточний каталог:

docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9

У Linux:

docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9

Хресна платформа

Наступні параметри працюватимуть як на PowerShell, так і на Linux (принаймні Ubuntu):

docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9
docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9

Ваш приклад для CMD правильний і чудово працює! Варіант Power Shell не працює, хоча сам $ pwd.path правильний, він не вирішений до правильного значення при використанні в сценарії: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}працює і в системах Unix (Linux, macOS). Примітка : pwd= теперішній робочий каталог
thiagowfx

2
@cjsimon Насправді виглядає, що може бути ... схоже на підтримку PowerShell, $(pwd)яка також працюватиме на Linux (я думаю - неперевірено)
ETL

13
З Git Bash це може бути winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9або winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos

1
не працює для мене на Windows 10, успіх монтажу, але цільовий каталог порожній
J. Doem

23

Це працює для мене в PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data

5
Чи все-таки це дійсно? При спробі я отримую наступне:PS C:\Users\X\Projects\docker_django> docker run --rm -v ${PWD}:/data alpine ls /data C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: invalid mode: /data. See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.
mislaba

@mistalaba Якщо ви використовуєте Windows 10, спробуйте використовувати Docker for Windowsзамість Toolbox.
Фінлай Роелофс

2
@ finlay-roelofs Дякую, але Docker for Win працює лише з Win Pro.
помилка

9

Для Git Bash для Windows (у ConEmu) для мене працює наступне (для контейнерів Docker Windows):

docker run --rm -it -v `pwd -W`:c:/api microsoft/dotnet:2-runtime

Зверніть увагу на зворотні сторони / зворотні котировки навколо pwd -W!

З усіма іншими варіаціями PWD, які я пробував, я отримав: "Error response from daemon: invalid volume specification: ..."

Оновлення: вище було вказано для контейнерів Docker Windows, для контейнерів Linux:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2

Не працював для мене від cmder docker run -v pwd -W: / usr / share / atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Файл не знайдено: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

Я робив, у тому числі задні підказки, і він прекрасно працював, використовуючи gitbash для windows
Thiago Cardoso

Я можу підтвердити, що це працює і з гіпер-гітбашем у першому варіанті
Енді

Повернення - це менш ефективний спосіб виконання вбудованої команди. Кращий спосіб - скористатись командою $ (command), а не`command`
Тимофієм,

8
  1. Відкрийте Налаштування на робочому столі Docker (Docker для Windows).
  2. Виберіть Спільні диски .
  3. Виберіть диск, який потрібно використовувати всередині контейнерів (наприклад, C).
  4. Натисніть Застосувати . Вас можуть попросити надати облікові дані користувачів. Увімкнення накопичувачів для контейнерів у Windows

  5. Команда нижче повинна тепер працювати на PowerShell (командний рядок не підтримує ${PWD}):

    docker run --rm -v ${PWD}:/data alpine ls /data

ВАЖЛИВО : якщо / при зміні пароля домену Windows, кріплення перестане працювати безшумно , тобто -vпрацюватиме, але контейнер не буде бачити папки та файли хостів. Рішення : поверніться до «Налаштування», зніміть прапорці спільних накопичувачів, застосуйте , перевірте їх ще раз, застосуйте та введіть новий пароль, коли буде запропоновано.


2

Ось моя, сумісна як для Win10 docker-ce, так і для Win7 docker-toolbox. У той час, коли я це пишу :).

Ви можете помітити, що я віддаю перевагу використанню / host_mnt / c замість c: / тому, що я іноді стикався з проблемою на docker-ce Win 10 з c: /

$WIN_PATH=Convert-Path .

#Convert for docker mount to be OK on Windows10 and Windows 7 Powershell
#Exact conversion is : remove the ":" symbol, replace all "\" by "/", remove last "/" and minor case only the disk letter
#Then for Windows10, add a /host_mnt/" at the begin of string => this way : c:\Users is translated to /host_mnt/c/Users
#For Windows7, add "//" => c:\Users is translated to //c/Users
$MOUNT_PATH=(($WIN_PATH -replace "\\","/") -replace ":","").Trim("/")

[regex]$regex='^[a-zA-Z]/'
$MOUNT_PATH=$regex.Replace($MOUNT_PATH, {$args[0].Value.ToLower()})

#Win 10
if ([Environment]::OSVersion.Version -ge (new-object 'Version' 10,0)) {
$MOUNT_PATH="/host_mnt/$MOUNT_PATH"
}
elseif ([Environment]::OSVersion.Version -ge (new-object 'Version' 6,1)) {
$MOUNT_PATH="//$MOUNT_PATH"
}

docker run -it -v "${MOUNT_PATH}:/tmp/test" busybox ls /tmp/test

Хочеться прокоментувати та підтвердити, що це відповідь на мільйон доларів для Docker Toolbox на Windows Server 2012 !!!! Відмінна робота! Для будь-якої цікавості ${MOUNT_PATH}вирішується як/c/Program Files/Docker Toolbox
petrosmm

2

Інші рішення для Git Bash, надані іншими, не працювали для мене. Мабуть, в Git для Windows зараз існує помилка / обмеження. Дивіться це і це .

Нарешті мені вдалося змусити його працювати після пошуку цієї теми GitHub (яка надає деякі додаткові рішення, якщо ви зацікавлені, які можуть працювати для вас, але не для мене).

Я в кінцевому рахунку використовував такий синтаксис:

MSYS_NO_PATHCONV=1 docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9

Зверніть увагу на MSYS_NO_PATHCONV=1передню частину dockerкоманди та $(pwd)- круглі дужки, малі регістри pwd, жодних лапок та зворотних косих риси.

Крім того, я використовую контейнери Linux для Windows, якщо це має значення ..

Я перевірив це в нових терміналах Windows, ConEmu та GitBash, і всі вони працювали на мене.


Здрастуйте, це допомогло мені нарешті налагодити це. Чи знаєте ви, навіщо нам потрібен MSYS_NO_PATHCONV=1варіант команди? В іншому випадку мій дирінг на морі призначення заповнився "c: / tools / cmder / vendor / git-for-windows"
Austin L

1

Ця команда повинна це виправити.

docker run --rm -it -v ${PWD}:c:\datamirkohaaser / docker-klitools

{PWD} - поточна папка хоста. після :- це папка контейнера. Якщо встановлення правильне, файли будуть вказані в директорі c:\dataв контейнері.


1

Потрібно поміняти місцями всі задні косої риски, щоб нахилити їх внизу

docker -v C: \ my \ папка: / mountlocation ...

до

docker -v C: / my / папка: / mountlocation ...

Я звичайно дзвоню докер з CMD-скрипту, де я хочу, щоб папка могла бути відносно сценарію, який я дзвоню, тому в цьому сценарії я це роблю ...

SETLOCAL

REM capture the path to this file so we can call on relative scrips
REM without having to be in this dir to do it.

REM capture the path to $0 ie this script
set mypath=%~dp0

REM strip last char
set PREFIXPATH=%mypath:~0,-1%

echo "PREFIXPATH=%PREFIXPATH%"
mkdir -p %PREFIXPATH%\my\folder\to\mount

REM swap \ for / in the path
REM because docker likes it that way in volume mounting
set PPATH=%PREFIXPATH:\=/%
echo "PPATH=%PPATH%"

REM pass all args to this script to the docker command line with %*
docker run --name mycontainername --rm -v %PPATH%/my/folder/to/mount:/some/mountpoint  myimage %*

ENDLOCAL

1

Командний рядок ( Cmd.exe)

Коли Docker CLI використовується з Windows Cmd.exe, використовуйте %cd%для монтажу поточного каталогу:

echo test > test.txt
docker run --rm -v %cd%:/data busybox ls -ls /data/test.txt

Git Bash (MinGW)

Коли докер CLI використовується з Git Bash (MinGW), монтажу поточного каталогу може не вдатися через перетворення контуру POSIX: додається об'єм, встановлений Docker; C до кінця шляху Windows при перекладі з контуру стилю Linux .

Уникніть контурів POSIX шляхом префіксації за допомогою /

Щоб пропустити конверсію контуру, контури POSIX повинні бути встановлені префіксом косою косою ( /), щоб мати провідну подвійну косу рису ( //), включаючи/$(pwd)

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt

Вимкнути конверсію шляху

Вимкніть перетворення контуру POSIX в Git Bash (MinGW), встановивши MSYS_NO_PATHCONV=1змінну середовища на командному рівні

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt

або рівня оболонки (системи)

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt

-2
docker run --rm -v /c/Users/Christian/manager/bin:/app --workdir=/app  php:7.2-cli php  app.php

Git bash

 cd /c/Users/Christian/manager
    docker run --rm -v  ${PWD}:/app  --workdir=/app  php:7.2-cli php  bin/app.php

echo ${PWD} результат:

/ c / Користувачі / Крістіан / менеджер

cmd або PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} результат:

Шлях ---- C: \ Користувачі \ Крістіан \ менеджер

як ми бачимо в cmd або PowerShell $ {PWD} не працюватимуть


4
Також англійською мовою напишіть, будь ласка, пояснення свого рішення. Це допоможе боротися з помилковим уявленням про те, що StackOverflow - це безкоштовна послуга написання коду.
Yunnosch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.