Il volume montato su Docker aggiunge; C alla fine del percorso di Windows quando si traduce dal percorso in stile Linux


88

Ho trovato alcune stranezze interessanti quando ho provato a montare un'immagine finestra mobile su Windows.

Ho creato uno .shscript che esegue un montaggio della cartella del progetto per eseguire la nostra immagine dell'ambiente di sviluppo. Voglio uno script che ogni sviluppatore possa eseguire, indipendentemente dalla propria macchina. Tutto ciò che fa è eseguire la finestra mobile con la cartella del progetto corrente.

#!/usr/bin/env bash
docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev

Funziona bene. Ora il piano è chiamare questo script da npm, quindi mi piacerebbe che funzionasse in relazione alla cartella corrente. Proviamo un'altra versione.

docker run -it --rm -v $PWD:/wkDir $IMAGE_TAG yarn dev

Non riesce con:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from 
daemon: Mount denied:
The source path "D:/my/project/folder;C"
doesn't exist and is not known to Docker.

Wat. Cosa ;Ce da dove viene?

Quindi faccio quello echo $PWDche mi dà /d/my/project/folder.

Interessante, quindi si $PWDrisolve nel percorso corretto nel formato del percorso di Linux, e sembra che docker stia cercando di tradurre da quello al percorso di Windows corretto, tranne che c'è questo ;Cche appare dal nulla. E \sono /...

Cosa sta succedendo esattamente qui?

Ottengo lo stesso risultato nel terminale git bash e powershell di VSCode.

Aggiornamento: ho notato che eseguendo il .shterminale powershell di VSCode, si apre una cmd.exefinestra della console separata che sembra eseguire lo script in git bash. Quindi questo potrebbe essere un problema di git bash.

Risposte:


126

Quindi, con un po 'di ricerca in più, ho trovato questi tre thread, relativi a git-bash che rimuove il docker mount:

https://forums.docker.com/t/weird-error-under-git-bash-msys-solved/9210 https://github.com/moby/moby/issues/24029#issuecomment-250412919

Quando cerco la documentazione di mingw sulla conversione del percorso che git-bash sta utilizzando, trovo questa tabella di sintassi: http://www.mingw.org/wiki/Posix_path_conversion

Uno dei quali emette nel formato: x;x;C:\MinGW\msys\1.0\x. Nota il ;Cin esso. Se git-bash sta cercando di essere intelligente, riempiendo la sintassi e producendo un percorso con questo formato, questo lo spiegherebbe.

La soluzione è sfuggire alla conversione del percorso, utilizzando anteponendo /. Quindi il comando docker funzionante per eseguire docker da git-bash con la directory di lavoro presente:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev

9
Ho scoperto che dovevo anche avvolgere il percorso in una stringa, quindi"/${PWD}"
Bananaapple

11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start Alla fine ho scoperto che dovevo usare la barra principale con parentesi invece delle parentesi graffe. Inoltre, con la directory di lavoro avevo bisogno di due barre iniziali. FYI: questo è il comando di cui avevo bisogno per Docker per sviluppatori Web su Pluralsight
Andy2K11

Questo ha funzionato per me (su Windows 10 git bash): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa

2
Salvavita. Windows10 e git-bash qui, mi ci è voluto molto tempo per provare a montare il volume senza usare docker-compose, finché non vedo questo post. Ora questo funziona: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Grazie.
Emily

VITA. RISPARMIO. +1000000
Jonathan Tuzman

3

Per me la soluzione era semplicemente includere una barra di chiusura /alla fine di ogni percorso .

Ad esempio invece di

/opt/apache-atlas-2.0.0/bin/atlas_start.py

...uso

/opt/apache-atlas-2.0.0/bin/atlas_start.py/


3

Il montaggio della directory corrente in un contenitore Docker in Windows 10 da Git Bash (MinGW) potrebbe non riuscire a causa di una conversione del percorso POSIX. Qualsiasi percorso che inizia con /viene convertito in un percorso Windows valido.

touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# ls: C:/Git/data/test.txt: No such file or directory

Fuggi dai percorsi POSIX anteponendo /

Per saltare la conversione del percorso, tutti i percorsi POSIX devono essere preceduti da una barra ( /), tra cui /$(pwd).

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 //data/test.txt

In Git Bash il percorso //data/test.txtnon viene convertito e nelle shell Linux //(doppia barra iniziale) viene ignorato e trattato allo stesso modo di /.

Disabilita la conversione del percorso

Disabilita la conversione del percorso POSIX in Git Bash (MinGW) utilizzando MSYS_NO_PATHCONVla variabile d'ambiente.

La conversione del percorso può essere disabilitata a livello di comando:

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

La conversione del percorso può essere disabilitata a livello di shell (o sistema):

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

2
Grazie per aver fornito questa soluzione in quanto l'escape non ha funzionato per me, mentre disabilitando la conversione del percorso sì.
Chanandler Bong

0

Puoi provare sotto il comando -

docker run -it --rm -v %cd%:/wkDir $IMAGE_TAG yarn dev

0

In realtà ho avuto lo stesso problema. A seconda che tu stia usando Git Bash, questo comando funziona (usando nginx come esempio):

docker container run --name container-name -v `pwd -W` / html: / usr / share / nginx / html -p 8000: 80 -d nginx

ovviamente puoi specificare la porta e la directory come desideri.


0

Ho avuto lo stesso problema su git bash e non sul prompt dei comandi. Puoi invece

docker run -it --rm -v "/${PWD}/D:\my\project\folder":/wkDir $IMAGE_TAG yarn dev

0

Straight ha funzionato per me qui sotto. semplicemente non usare la variabile dinamica.

docker run --rm -u root -p 8080:8080 -v jenkins-data/:/var/jenkins_home -v /var/run/docker.sock/:/var/run/docker.sock -v /Users/<YOUR USER NAME>/:/home jenkinsci/blueocean
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.