it-swarm.com.de

Hängen Sie das aktuelle Verzeichnis als ein Volume in Docker unter Windows 10 ein

Beschreibung

Ich verwende Docker Version 1.12.5 unter Windows 10 über Hyper-V und möchte ausführbare Container-Befehle als Befehle im aktuellen Pfad verwenden. Ich habe ein Docker-Image erstellt, das gut ausgeführt wird, aber ich habe ein Problem, den aktuellen Pfad einzuhängen. 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 anzuzeigen, dass der Befehl funktioniert. Die Docker-Datei erstellt das Verzeichnis /data und definiert es als VOLUME und WORKDIR.

Da E:\test das aktuelle Verzeichnis in PowerShell ist und der Docker-Befehl mit einem absoluten Pfad ausgeführt wird, kann ich den Inhalt von E:\test sehen:

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 aufgrund unterschiedlicher Fehlermeldungen nicht auf dem Volume 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'.

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: "E:\\test" is not a valid repository/tag.
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: 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 für das Mounten des aktuellen Verzeichnisses als Volume in Docker unter Windows 10?

50
McGo

In der Windows-Befehlszeile (cmd) können Sie das aktuelle Verzeichnis wie folgt einhängen:

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

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

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

Cross Platform

Die folgenden zwei Optionen sind sowohl für PowerShell als auch für Linux verfügbar:

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

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

108
ETL

Dies funktioniert für mich in PowerShell:

docker run --rm -v ${PWD}:/data Alpine ls /data
16
friism

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

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

Beachten Sie die Backticks/Backquotes um pwd -W

Bei allen anderen PWD-Varianten, die ich ausprobiert habe, habe ich Folgendes 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
3
ToastedSoul
  1. Öffnen Sie Einstellungen auf Docker Desktop (Docker für Windows).
  2. Wählen Sie Shared Drives .
  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. Enabling drives for containers on Windows

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

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

1
Paulo Merson

Sie müssen alle hinteren Schrägstriche gegen vorwärts gerichtete Schrägstriche austauschen

docker -v C:\Mein\Ordner:/mountlocation ...

zu 

docker -v C:/mein/Ordner:/mountlocation ...

Normalerweise rufe ich Docker von einem Cmd-Skript aus an, in dem der Ordner relativ zum Skript bereitgestellt werden soll, das ich anrufe. In diesem Skript mache ich das ...

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

Dieser Befehl sollte es beheben.

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

{PWD} ist der aktuelle Ordner des Hosts. nach dem : ist der Containerordner. Wenn das Mounten korrekt ist, werden die Dateien im Director c:\data im Container aufgelistet. 

0
Blue Clouds

Hier ist meiner, der für Win10 Docker-ce und Win7 Docker-Toolbox kompatibel ist. Zum jetzigen Zeitpunkt schreibe ich das :). 

Sie können feststellen, dass ich/host_mnt/c anstelle von c:/vorziehen möchte, da ich manchmal Probleme mit Docker-ce habe.

$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
0
jseguillon