Mounten Sie das aktuelle Verzeichnis als Volume in Docker unter Windows 10

130

Beschreibung

Ich verwende Docker Version 1.12.5 unter Windows 10 über Hyper-V und möchte ausführbare Container-Dateien als Befehle im aktuellen Pfad verwenden. Ich habe ein Docker-Image erstellt, das einwandfrei funktioniert, aber ich habe ein Problem beim Mounten des aktuellen Pfads. Die Idee ist, einen Alias ​​zu erstellen und einen docker run --rm [...]Befehl auszuführen, damit er systemweit im aktuellen Verzeichnis verwendet werden kann.

Konfiguration

Ich habe ein Laufwerk E mit einem Ordner "test" und dort einen Ordner namens "Ordner auf Windows-Host", um zu zeigen, dass der Befehl funktioniert. Die Docker-Datei erstellt das Verzeichnis /dataund definiert es als VOLUME und WORKDIR.

Als E:\testaktuelles Verzeichnis in PowerShell und Ausführen des Docker-Befehls mit einem absoluten Pfad kann ich den Inhalt von sehen 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

Ich möchte das aktuelle Verzeichnis verwenden und keine absolute Notation. Ich konnte pwd im Volume wegen verschiedener Fehlermeldungen nicht verwenden:

Versuchen mit ($ 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'.

Versuch mit / ($ 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'.

Versuch mit \ ´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'.

Versuchen mit "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'.

Wie lautet die korrekte Syntax zum Mounten des aktuellen Verzeichnisses als Volume in Docker unter Windows 10?

McGo
quelle

Antworten:

305

In Windows Command Line ( cmd) können Sie das aktuelle Verzeichnis wie folgt bereitstellen:

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

In PowerShell verwenden ${PWD}Sie das aktuelle Verzeichnis:

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

Unter Linux:

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

Plattformübergreifend

Die folgenden Optionen funktionieren sowohl unter PowerShell als auch unter Linux (mindestens 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
quelle
Ihr Beispiel für CMD ist korrekt und funktioniert hervorragend! Die Power Shell-Variante funktioniert nicht, obwohl $ pwd.path selbst korrekt ist, wird sie bei Verwendung im Skript nicht auf den richtigen Wert aufgelöst: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo
3
${PWD}funktioniert auch auf Unix-Systemen (Linux, macOS). Hinweis : pwd= aktuelles Arbeitsverzeichnis
thiagowfx
2
@cjsimon Es sieht tatsächlich so aus, als ob es ... PowerShell-Unterstützungen geben könnte, $(pwd)die auch unter Linux funktionieren würden (ich denke - ungetestet)
ETL
12
Mit Git Bash kann es entweder winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9oder sein winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
Kittaakos
1
funktioniert nicht für mich unter Windows 10, Mounting-Erfolg, aber Zielverzeichnis sind leer
J. Doem
22

Dies funktioniert bei mir in PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data
Friismus
quelle
4
Ist das noch gültig? Ich bekomme Folgendes, wenn ich es versuche: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 Wenn Sie Windows 10 verwenden, versuchen Sie es mit Docker for Windowsanstelle von Toolbox.
Finlay Roelofs
2
@ finlay-roelofs Danke, aber Docker for Win funktioniert nur mit Win Pro.
Mistalaba
9

Für Git Bash für Windows (in ConEmu) funktioniert Folgendes für mich (für Docker Windows-Container):

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

Beachten Sie die Backticks / einfachen Anführungszeichen um pwd -W!

Mit allen anderen Varianten von PWD, die ich ausprobiert habe, habe ich erhalten: "Error response from daemon: invalid volume specification: ..."

Update: Das Obige war für Docker Windows-Container, für Linux-Container:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2
ToastedSoul
quelle
Hat bei mir nicht funktioniert, wenn der Cmder-Docker -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos ausgeführt hat. Datei nicht gefunden: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius
Ich tat es, einschließlich der Backticks, und es funktionierte gut mit Gitbash für Windows
Thiago Cardoso
Ich kann bestätigen, dass dies auch mit Hyper Gitbash bei der ersten Option funktioniert
Andy
Die Backticks sind eine weniger effiziente Methode zum Ausführen eines eingebetteten Befehls. Der bessere Weg ist, $ (Befehl) zu verwenden, anstatt`command`
Timothy c
8
  1. Öffnen Sie die Einstellungen auf Docker Desktop (Docker für Windows).
  2. Wählen Sie Freigegebene Laufwerke .
  3. Wählen Sie das Laufwerk aus, das Sie in Ihren Containern verwenden möchten (z. B. C).
  4. Klicken Sie auf Übernehmen . Möglicherweise werden Sie aufgefordert, Benutzeranmeldeinformationen anzugeben. Aktivieren von Laufwerken für Container unter Windows

  5. Der folgende Befehl sollte jetzt unter PowerShell funktionieren (Eingabeaufforderung wird nicht unterstützt ${PWD}):

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

WICHTIG : wenn / falls Sie Ihre Windows - Domäne - Kennwort ändern, stoppt die Montage arbeitet geräuschlos , das ist -vwird funktionieren , aber der Behälter nicht sehen Ihre Host - Ordner und Dateien. Lösung : Gehen Sie zurück zu Einstellungen, deaktivieren Sie die freigegebenen Laufwerke, Übernehmen Sie sie , überprüfen Sie sie erneut , Übernehmen Sie und geben Sie das neue Kennwort ein, wenn Sie dazu aufgefordert werden.

Paulo Merson
quelle
2

Hier ist meine, die sowohl für Win10 Docker-CE als auch für Win7 Docker-Toolbox kompatibel ist. Zur Zeit schreibe ich das :).

Sie können feststellen, dass ich lieber / host_mnt / c anstelle von c: / verwende, da ich manchmal Probleme mit Docker-ce Win 10 mit c: / hatte

$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
quelle
Ich möchte kommentieren und bestätigen, dass dies eine Millionen-Dollar-Antwort für Docker Toolbox unter Windows Server 2012 ist !!!! Exzellente Arbeit! Für jedermanns Neugier, ${MOUNT_PATH}löst sich als/c/Program Files/Docker Toolbox
petrosmm
2

Andere von anderen bereitgestellte Lösungen für Git Bash haben bei mir nicht funktioniert. Anscheinend gibt es derzeit einen Fehler / eine Einschränkung in Git für Windows. Sehen Sie dies und das .

Nachdem ich diesen GitHub-Thread gefunden hatte, gelang es mir endlich, ihn zum Laufen zu bringen (der bei Interesse einige zusätzliche Lösungen bietet, die für Sie funktionieren könnten, für mich aber nicht).

Am Ende habe ich die folgende Syntax verwendet:

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

Beachten Sie die MSYS_NO_PATHCONV=1vor dem dockerBefehl stehenden und $(pwd)- runden Klammern, pwd in Kleinbuchstaben, keine Anführungszeichen, keine umgekehrten Schrägstriche.

Außerdem verwende ich Linux-Container unter Windows, wenn das wichtig ist.

Ich habe dies im neuen Windows-Terminal ConEmu und GitBash getestet und alle haben für mich funktioniert.

pootzko
quelle
Hallo, das hat mir endlich geholfen, das zum Laufen zu bringen. Wissen Sie, warum wir die Befehlsoption benötigen MSYS_NO_PATHCONV=1? Andernfalls wurde mein Ziel-Mount-Verzeichnis mit "c: / tools / cmder / vendor / git-for-windows" gefüllt
Austin L
1

Dieser Befehl sollte das Problem beheben.

Docker-Lauf --rm -it -v ${PWD}:c:\datamirkohaaser / Docker-Clitools

{PWD} ist der aktuelle Hostordner. Nach dem :ist der Containerordner. Wenn die Montage korrekt ist, werden die Dateien im Director c:\dataim Container aufgelistet .

Blaue Wolken
quelle
1

Sie müssen alle hinteren Schrägstriche gegen vordere Schrägstriche austauschen, also ändern Sie sie

Docker -v C: \ my \ Ordner: / mountlocation ...

zu

Docker -v C: / my / Ordner: / mountlocation ...

Normalerweise rufe ich Docker von einem Cmd-Skript aus auf, in dem der Ordner relativ zu dem Skript, das ich aufrufe, bereitgestellt werden soll. In diesem Skript mache ich dies ...

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
quelle
0

Eingabeaufforderung ( Cmd.exe)

Wenn die Docker-CLI unter Windows Cmd.exeverwendet wird %cd%, stellen Sie das aktuelle Verzeichnis bereit:

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

Git Bash (MinGW)

Wenn die Docker-CLI über Git Bash (MinGW) verwendet wird, schlägt das Mounten des aktuellen Verzeichnisses möglicherweise aufgrund einer POSIX- Pfadkonvertierung fehl: Das von Docker gemountete Volume fügt beim Übersetzen vom Linux-Pfad C das Ende des Windows-Pfads hinzu .

Entkommen Sie den POSIX-Pfaden, indem Sie ein Präfix mit /

Um die Pfadkonvertierung zu überspringen, muss POSIX-Pfaden der Schrägstrich ( /) vorangestellt werden, um einen führenden doppelten Schrägstrich ( //) zu erhalten, einschließlich/$(pwd)

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

Deaktivieren Sie die Pfadkonvertierung

Deaktivieren Sie die POSIX-Pfadkonvertierung in Git Bash (MinGW), indem Sie die MSYS_NO_PATHCONV=1Umgebungsvariable auf Befehlsebene festlegen

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

oder Shell (System) Ebene

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
Evgeniy Khyst
quelle
-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} Ergebnis:

/ c / Benutzer / Christian / Manager

cmd oder PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} Ergebnis:

Pfad ---- C: \ Benutzer \ Christian \ Manager

Wie wir in cmd oder PowerShell sehen, funktioniert $ {PWD} nicht

Александр Рыкованов
quelle
4
Schreiben Sie auch auf Englisch eine Erklärung Ihrer Lösung. Dies würde helfen, das Missverständnis zu bekämpfen, dass StackOverflow ein kostenloser Dienst zum Schreiben von Code ist.
Yunnosch