Описание

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

Trying with `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

Ответов: 10

Ответы (10)

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

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

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

Командная строка (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
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

эхо $ {PWD} результат:

/c/Users/Christian/manager

cmd или PowerShell

  cd C:\Users\Christian\manager

эхо $ {PWD} результат:

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

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

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

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

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

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

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

  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 будет работать, но контейнерне будет видеть папки и файлы вашего хоста.Решение: вернитесь в настройки, снимите флажки с общих дисков, Применить, проверьте их еще раз, Применитьи введите новый пароль при появлении запроса.

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

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

Обратите внимание на обратные кавычки / обратные кавычки около pwd -W!

Со всеми другими вариантами PWD, которые я пробовал, я получил: «Ответ об ошибке от демона: недопустимая спецификация тома: ...»

Обновление: Вышеупомянутое было для контейнеров Docker Windows, для контейнеров Linux используйте:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore: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

Другие решения для Git Bash, предоставленные другими, у меня не работали. По-видимому, в настоящее время в Git для Windows есть ошибка / ограничение. См. это и это.

Мне, наконец, удалось заставить его работать после того, как я нашел этот поток GitHub (который предоставляет некоторые дополнительные решения, если вам интересно, которые могут сработать для вас, но не для меня).

В итоге я использовал следующий синтаксис:

MSYS_NO_PATHCONV = 1 запуск докера --rm -it -v $ (pwd): / usr / src / project gcc: 4.9

Обратите внимание на MSYS_NO_PATHCONV = 1 перед командой docker и $ (pwd) - круглые скобки, pwd в нижнем регистре, без кавычек, нет обратная косая черта.

Кроме того, я использую контейнеры Linux в Windows, если это важно ..

Я тестировал это в новом Windows Terminal, ConEmu и GitBash, и все они у меня сработали.

2022 WebDevInsider