Zamontuj bieżący katalog jako wolumin w Docker w systemie Windows 10

132

Opis

Używam Dockera w wersji 1.12.5 w systemie Windows 10 przez Hyper-V i chcę używać plików wykonywalnych kontenera jako poleceń w bieżącej ścieżce. Zbudowałem obraz Dockera, który działa poprawnie, ale mam problem z zamontowaniem bieżącej ścieżki. Pomysł polega na utworzeniu aliasu i wykonaniu docker run --rm [...]polecenia, aby można go było używać w całym systemie w bieżącym katalogu.

Ustawiać

Mam dysk E z folderem „test”, a tam folder o nazwie „folder na hoście systemu Windows”, aby pokazać, że polecenie działa. Dockerfile tworzy katalog /data, definiuje go jako VOLUME i WORKDIR.

Mając E:\testjako bieżący katalog w PowerShell i wykonując polecenie Docker ze ścieżką bezwzględną, widzę zawartość 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

Problem

Chcę używać bieżącego katalogu, a nie notacji absolutnej. Nie mogłem użyć pwd w woluminie z powodu różnych komunikatów o błędach:

Próbuję z ($ 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'.

Próbuję z / ($ 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'.

Próbuję z \ ´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'.

Próbuję z „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'.

Jaka jest poprawna składnia montowania bieżącego katalogu jako woluminu w Dockerze w systemie Windows 10?

McGo
źródło

Odpowiedzi:

308

W wierszu poleceń Windows ( cmd) możesz zamontować bieżący katalog w następujący sposób:

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

W PowerShell używasz ${PWD}, co daje ci bieżący katalog:

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

W systemie Linux:

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

Między platformami

Następujące opcje będą działać zarówno w PowerShell, jak i na Linuksie (przynajmniej 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
źródło
Twój przykład dla CMD jest poprawny i działa świetnie! Wariant Power Shell nie działa, chociaż sam $ pwd.path jest poprawny, nie jest tłumaczony na poprawną wartość, gdy jest używany w skrypcie: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo
3
${PWD}działa również na systemach Unix (Linux, macOS). Uwaga : pwd= obecny katalog roboczy
thiagowfx
2
@cjsimon Wygląda na to, że może być ... wygląda na to, że obsługuje PowerShell, $(pwd)który działałby również w systemie Linux (myślę, że - nietestowany)
ETL
13
W przypadku Git Bash może to być opcja winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9lub winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos
1
nie działa dla mnie w
systemie
23

To działa dla mnie w PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data
friizm
źródło
5
Czy to jest nadal aktualne? Podczas próby otrzymuję następujące informacje: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 Jeśli używasz systemu Windows 10, spróbuj użyć Docker for Windowszamiast Toolbox.
Finlay Roelofs,
2
@ finlay-roelofs Dzięki, ale Docker for Win działa tylko z Win Pro.
mistalaba
9

W przypadku Git Bash dla Windows (w ConEmu) działa dla mnie (dla kontenerów Docker Windows):

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

Zwróć uwagę na znaki odwrotne / cudzysłowy wokół pwd -W!

Ze wszystkimi innymi odmianami PWD, które wypróbowałem, otrzymałem: "Error response from daemon: invalid volume specification: ..."

Aktualizacja: Powyższe dotyczyło kontenerów Docker Windows, do użycia kontenerów Linux:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2
ToastedSoul
źródło
Nie działało dla mnie z cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Nie znaleziono pliku: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius
Zrobiłem, łącznie z tylnymi znakami, i działało dobrze, używając gitbash dla Windows
Thiago Cardoso
Mogę potwierdzić, że działa to również z hiper gitbashem w pierwszej opcji
Andy,
Cofnięcia są mniej wydajnym sposobem wykonywania osadzonego polecenia. Lepszym sposobem jest użycie $ (polecenie) zamiast`command`
Timothy c
8
  1. Otwórz ustawienia na pulpicie platformy Docker (Docker dla systemu Windows).
  2. Wybierz Dyski współdzielone .
  3. Wybierz dysk, którego chcesz używać wewnątrz swoich kontenerów (np. C).
  4. Kliknij Zastosuj . Możesz zostać poproszony o podanie poświadczeń użytkownika. Włączanie dysków dla kontenerów w systemie Windows

  5. Poniższe polecenie powinno teraz działać w PowerShell (wiersz polecenia nie obsługuje ${PWD}):

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

WAŻNE : jeśli zmienisz hasło do domeny Windows, uchwyt przestanie działać cicho , to znaczy -vbędzie działał, ale kontener nie będzie widział folderów i plików twojego hosta. Rozwiązanie : wróć do Ustawień, odznacz dyski współdzielone, Zastosuj , zaznacz je ponownie, Zastosuj i wprowadź nowe hasło po wyświetleniu monitu.

Paulo Merson
źródło
2

Oto moje, które jest kompatybilne zarówno z Win10 docker-ce, jak i Win7 docker-toolbox. W tej chwili to piszę :).

Możesz zauważyć, że wolę używać / host_mnt / c zamiast c: /, ponieważ czasami napotykałem problemy na docker-ce Win 10 z 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
źródło
Chciałbym skomentować i potwierdzić, że jest to odpowiedź za milion dolarów dla Docker Toolbox w systemie Windows Server 2012 !!!! Świetna robota! Z ciekawości ${MOUNT_PATH}rozstrzyga się jako/c/Program Files/Docker Toolbox
petrosmm
2

Inne rozwiązania dla Git Bash dostarczone przez innych nie działały dla mnie. Najwyraźniej w Git dla Windows jest obecnie błąd / ograniczenie. Zobacz to i to .

W końcu udało mi się go uruchomić po znalezieniu tego wątku GitHub (który zapewnia dodatkowe rozwiązania, jeśli jesteś zainteresowany, które mogą działać dla ciebie, ale nie dla mnie).

Skończyło się na użyciu następującej składni:

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

Zwróć uwagę na MSYS_NO_PATHCONV=1przednią część dockerpolecenia i $(pwd)- nawiasy okrągłe, małe litery pwd, bez cudzysłowów, bez odwrotnych ukośników.

Jeśli to ma znaczenie, używam kontenerów Linuksa w systemie Windows.

Przetestowałem to w nowym terminalu Windows, ConEmu i GitBash i wszystkie działały dla mnie.

pootzko
źródło
Witam, pomogło mi to w końcu w uruchomieniu. Czy wiesz, dlaczego potrzebujemy MSYS_NO_PATHCONV=1opcji polecenia? W przeciwnym razie mój docelowy katalog montowania został wypełniony „c: / tools / cmder / vendor / git-for-windows”
Austin L
1

To polecenie powinno to naprawić.

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

{PWD} to bieżący folder hosta. po znaku :znajduje się folder kontenera. Jeśli montaż jest poprawny, pliki zostaną wyświetlone w dyrektorze c:\dataw kontenerze.

Niebieskie chmury
źródło
1

Musisz zamienić wszystkie tylne ukośniki na przednie, więc zmień

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

do

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

Zwykle wywołuję docker ze skryptu cmd, w którym chcę, aby folder do zamontowania był względem skryptu, który wywołuję, więc w tym skrypcie robię to ...

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
Karl
źródło
1

Wiersz polecenia ( Cmd.exe)

Gdy interfejs wiersza polecenia platformy Docker jest używany z systemu Windows Cmd.exe, użyj %cd%do zamontowania bieżącego katalogu:

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

Git Bash (MinGW)

Gdy interfejs wiersza poleceń Dockera jest używany z Git Bash (MinGW), montowanie bieżącego katalogu może się nie powieść z powodu konwersji ścieżki POSIX: wolumen zamontowany w Dockerze dodaje; C do ścieżki do końca okna podczas tłumaczenia ze ścieżki stylu linux .

Wyjdź ze ścieżek POSIX, poprzedzając je przedrostkiem /

Aby pominąć konwersję ścieżki, ścieżki POSIX muszą być poprzedzone ukośnikiem ( /), aby miały na początku podwójny ukośnik ( //), w tym/$(pwd)

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

Wyłącz konwersję ścieżki

Wyłącz konwersję ścieżki POSIX w Git Bash (MinGW), ustawiając MSYS_NO_PATHCONV=1zmienną środowiskową na poziomie polecenia

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

lub poziom powłoki (systemu)

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
Evgeniy Khyst
źródło
-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} wynik:

/ c / Users / Christian / manager

cmd lub PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} wynik:

Ścieżka ---- C: \ Users \ Christian \ manager

jak widzimy w cmd lub PowerShell $ {PWD} nie będzie działać

Александр Рыкованов
źródło
4
Prosimy również napisać wyjaśnienie rozwiązania w języku angielskim. Pomogłoby to w walce z błędnym przekonaniem, że StackOverflow to bezpłatna usługa pisania kodu.
Yunnosch