Смонтируйте текущий каталог как том в Docker в Windows 10

Описание

Я использую 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?

Ответы

Ответ 1

В командной строке 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

Ответ 2

Это работает для меня в PowerShell:

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

Ответ 3

Для 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

Ответ 4

Вот мой, который совместим как для 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

Ответ 5

  1. Откройте Настройки на рабочем столе Docker (Docker для Windows).
  2. Выберите Общие диски.
  3. Выберите диск, который вы хотите использовать внутри своих контейнеров (например, C).
  4. Нажмите Применить. Вас могут попросить предоставить учетные данные пользователя. Enabling drives for containers on Windows

  5. Команда ниже должна теперь работать в PowerShell (командная строка не поддерживает ${PWD}):

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

ВАЖНО: если/когда вы измените пароль домена Windows, монтирование перестанет работать без вывода сообщений, то есть -v будет работать, но контейнер не будет видеть ваши папки и файлы хоста. Решение: вернитесь в меню "Настройки", снимите флажки с общих дисков, нажмите "Применить", проверьте их еще раз, "Применить" и введите новый пароль при появлении запроса.

Ответ 6

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

Docker запускает --rm -it -v ${PWD}:c:\data mirkohaaser/docker-clitools

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

Ответ 7

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

Докер -v C:\my\folder: /mountlocation...

в

Докер -v C: /my/folder: /mountlocation...

Обычно я вызываю docker из сценария 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