Смонтировать текущий каталог как том в 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?

McGo
источник

Ответы:

309

В командной строке 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
ETL
источник
Ваш пример для CMD правильный и отлично работает! Вариант Power Shell не работает, хотя сам $ pwd.path верен, он не разрешается до правильного значения при использовании в скрипте: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo 05
3
${PWD}работает и в системах Unix (Linux, macOS). Примечание : pwd= текущий рабочий каталог
thiagowfx 07
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, установка
прошла
23

У меня это работает в PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data
friism
источник
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'.
mistalaba
@mistalaba Если вы используете Windows 10, попробуйте использовать Docker for Windowsвместо Toolbox.
Finlay Roelofs
2
@ finlay-roelofs Спасибо, но Docker для Win работает только с Win Pro.
mistalaba
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
ToastedSoul
источник
Не работал у меня из cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Файл не найден: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Мартинас Юсявичюс
Я сделал, включая обратные кавычки, и он отлично работал с использованием gitbash для Windows
Тьяго Кардосо,
Я могу подтвердить, что это работает и с Hyper Gitbash в первом варианте
Энди
Обратные кавычки - менее эффективный способ выполнения встроенной команды. Лучше использовать $ (command), а не`command`
Timothy c
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
jseguillon
источник
Хотел бы прокомментировать и подтвердить, что это ответ на миллион долларов для Docker Toolbox на Windows Server 2012 !!!! Отличная работа! ${MOUNT_PATH}/c/Program Files/Docker Toolbox
Любопытно
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 Terminal, ConEmu и GitBash, и все они у меня сработали.

pootzko
источник
Привет, это помогло мне наконец заставить это работать. Вы знаете, зачем нам нужен параметр MSYS_NO_PATHCONV=1команды? В противном случае мой целевой каталог монтирования был заполнен «c: / tools / cmder / vendor / git-for-windows»
Остин Л.
1

Эта команда должна это исправить.

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

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

Синие облака
источник
1

Вам нужно заменить все обратные косые черты на прямые, поэтому измените

docker -v C: \ my \ folder: / mountlocation ...

в

docker -v C: / my / folder: / 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)

Когда Docker 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} результат:

/ С / Users / Христианство / менеджер

cmd или PowerShell

  cd C:\Users\Christian\manager

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

Путь ---- C: \ Users \ Christian \ manager

как мы видим в cmd или PowerShell $ {PWD} не будет работать

Александр Рыкованов
источник
4
Также на английском языке напишите, пожалуйста, объяснение своего решения. Это поможет бороться с неправильным представлением о том, что StackOverflow - это бесплатный сервис для написания кода.
Юннош