Monta la directory corrente come volume in Docker su Windows 10


132

Descrizione

Sto utilizzando Docker versione 1.12.5 su Windows 10 tramite Hyper-V e desidero utilizzare gli eseguibili del contenitore come comandi nel percorso corrente. Ho creato un'immagine Docker che funziona correttamente, ma ho problemi a montare il percorso corrente. L'idea è di creare un alias ed eseguire un docker run --rm [...]comando in modo che possa essere utilizzato a livello di sistema nella directory corrente.

Impostare

Ho un drive E con una cartella "test" e lì dentro una cartella chiamata "cartella su host di Windows" per mostrare che il comando sta funzionando. Il Dockerfile crea la directory /data, la definisce come VOLUME e WORKDIR.

Avendo E:\testcome directory corrente in PowerShell ed eseguendo il comando Docker con un percorso assoluto, posso vedere il contenuto di 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

Problema

Voglio usare la directory corrente e non una notazione assoluta. Non ho potuto usare pwd nel volume a causa di diversi messaggi di errore:

Sto provando con ($ 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'.

Provando con / ($ 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'.

Sto provando con \ ´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'.

Provando con "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'.

Qual è la sintassi corretta per montare la directory corrente come volume in Docker su Windows 10?

Risposte:


308

Nella riga di comando di Windows ( cmd), puoi montare la directory corrente in questo modo:

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

In PowerShell, usi ${PWD}, che ti dà la directory corrente:

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

Su Linux:

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

Piattaforma multipla

Le seguenti opzioni funzioneranno sia su PowerShell che su Linux (almeno 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

Il tuo esempio per CMD è corretto e funziona alla grande! La variante Power Shell non funziona, sebbene $ pwd.path stesso sia corretto, non viene risolto con il valore corretto quando utilizzato nello script: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}funziona anche su sistemi Unix (Linux, macOS). Nota : pwd= directory di lavoro presente
thiagowfx

2
@cjsimon Sembra che in realtà potrebbero esserci ... sembra che PowerShell supporti $(pwd)che funzionerebbero anche su Linux (penso - non testato)
ETL

13
Con Git Bash può essere o winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9o winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos

1
non funziona per me su Windows 10, montaggio riuscito ma la directory di destinazione è vuota
J. Doem

23

Questo funziona per me in PowerShell:

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

5
È ancora valido? Quando ci provo ottengo quanto segue: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 Se stai usando Windows 10, prova a usare Docker for Windowsinvece di Toolbox.
Finlay Roelofs

2
@ finlay-roelofs Grazie, ma Docker per Win funziona solo con Win Pro.
mistalaba

9

Per Git Bash per Windows (in ConEmu), per me funziona quanto segue (per i contenitori Docker Windows):

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

Nota i backtick / backquote in giro pwd -W!

Con tutte le altre varianti di PWD che ho provato ho ricevuto: "Error response from daemon: invalid volume specification: ..."

Aggiornamento: quanto sopra era per i contenitori Docker Windows, per l'uso dei contenitori Linux:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2

Non ha funzionato per me da cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos File non trovato: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

L'ho fatto, inclusi i backtick, e ha funzionato bene usando gitbash per Windows
Thiago Cardoso

Posso confermare che funziona anche con hyper gitbash sulla prima opzione
Andy

I backtick sono un modo meno efficiente di eseguire un comando incorporato. Il modo migliore è usare $ (comando) piuttosto che`command`
Timoteo c

8
  1. Apri Impostazioni su Docker Desktop (Docker per Windows).
  2. Seleziona Drive condivisi .
  3. Selezionare l'unità che si desidera utilizzare all'interno dei contenitori (ad esempio, C).
  4. Fare clic su Applica . È possibile che ti venga chiesto di fornire le credenziali dell'utente. Abilitazione delle unità per i contenitori su Windows

  5. Il comando seguente dovrebbe ora funzionare su PowerShell (il prompt dei comandi non supporta ${PWD}):

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

IMPORTANTE : se / quando cambi la password del tuo dominio Windows, il montaggio smetterà di funzionare silenziosamente , cioè -vfunzionerà ma il contenitore non vedrà le tue cartelle e file host. Soluzione : torna in Impostazioni, deseleziona i Drive condivisi, Applica , ricontrollali, Applica e inserisci la nuova password quando richiesto.


2

Ecco il mio che è compatibile sia per Win10 docker-ce che per Win7 docker-toolbox. Al momento sto scrivendo questo :).

Puoi notare che preferisco usare / host_mnt / c invece di c: / perché a volte ho riscontrato problemi su docker-ce Win 10 con 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

Vorrei commentare e confermare che questa è una risposta da un milione di dollari per Docker Toolbox su Windows Server 2012 !!!! Lavoro eccellente! Per curiosità di chiunque, si ${MOUNT_PATH}risolve come/c/Program Files/Docker Toolbox
petrosmm

2

Altre soluzioni per Git Bash fornite da altri non hanno funzionato per me. Apparentemente c'è attualmente un bug / limitazione in Git per Windows. Vedi questo e questo .

Alla fine sono riuscito a farlo funzionare dopo aver trovato questo thread GitHub (che fornisce alcune soluzioni aggiuntive se sei interessato, che potrebbe funzionare per te, ma non per me).

Ho finito per utilizzare la seguente sintassi:

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

Notare il MSYS_NO_PATHCONV=1davanti al dockercomando e $(pwd)- parentesi tonde, pwd minuscolo, senza virgolette, senza barre rovesciate.

Inoltre, sto usando contenitori Linux su Windows se questo è importante.

Ho provato questo nel nuovo terminale di Windows, ConEmu e GitBash, e tutti hanno funzionato per me.


Ciao, questo mi ha aiutato finalmente a farlo funzionare. Sai perché abbiamo bisogno MSYS_NO_PATHCONV=1dell'opzione di comando? Altrimenti la mia directory mount di destinazione è stata riempita con "c: / tools / cmder / vendor / git-for-windows"
Austin L

1

Questo comando dovrebbe risolverlo.

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

{PWD} è la cartella corrente dell'host. dopo :c'è la cartella del contenitore. Se il montaggio è corretto, i file verranno elencati nel director c:\datanel contenitore.


1

Devi scambiare tutte le barre posteriori in barre in avanti, quindi cambia

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

per

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

Normalmente chiamo docker da uno script cmd in cui voglio che la cartella da montare sia relativa allo script che sto chiamando, quindi in quello script faccio questo ...

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

Prompt dei comandi ( Cmd.exe)

Quando la Docker CLI viene utilizzata da Windows Cmd.exe, utilizzare %cd%per montare la directory corrente:

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

Git Bash (MinGW)

Quando la Docker CLI viene utilizzata da Git Bash (MinGW), il montaggio della directory corrente potrebbe non riuscire a causa di una conversione del percorso POSIX: il volume montato Docker aggiunge; C alla fine del percorso di Windows durante la traduzione dal percorso in stile Linux .

Fuggi dai percorsi POSIX anteponendo /

Per saltare la conversione del percorso, i percorsi POSIX devono essere preceduti dalla barra ( /) per avere una doppia barra iniziale ( //), incluso/$(pwd)

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

Disabilita la conversione del percorso

Disabilita la conversione del percorso POSIX in Git Bash (MinGW) impostando MSYS_NO_PATHCONV=1la variabile d'ambiente a livello di comando

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

o livello shell (sistema)

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

-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} risultato:

/ C / Users / Christian / manager

cmd o PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} risultato:

Percorso ---- C: \ Users \ Christian \ manager

come vediamo in cmd o PowerShell $ {PWD} non funzionerà


4
Inoltre, in inglese, scrivi una spiegazione della tua soluzione. Ciò aiuterebbe a combattere il malinteso secondo cui StackOverflow è un servizio di scrittura di codice gratuito.
Yunnosch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.