Das von Docker bereitgestellte Volume fügt C zum Ende des Windows-Pfads hinzu, wenn vom Linux-Pfad übersetzt wird


88

Ich habe eine interessante Verrücktheit gefunden, als ich versucht habe, ein Docker-Image unter Windows zu mounten.

Ich habe ein .shSkript erstellt, das einen Mount des Projektordners ausführt, um unser Image der Entwicklerumgebung auszuführen. Ich möchte ein Skript, das jeder Entwickler ausführen kann, unabhängig von seinem Computer. Es wird lediglich Docker mit dem aktuellen Projektordner ausgeführt.

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

Läuft in Ordnung. Jetzt ist geplant, dieses Skript von aufzurufen npm, damit dies relativ zum aktuellen Ordner funktioniert. Versuchen wir es mit einer anderen Version.

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

Schlägt fehl mit:

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. Was ;Cund woher kommt es?

Also mache ich echo $PWDwas mir gibt /d/my/project/folder.

Interessant, also wird $PWDder richtige Pfad im Linux-Pfadformat aufgelöst, und es scheint, als würde Docker versuchen, diesen Pfad in den richtigen Windows-Pfad zu übersetzen, außer es gibt diesen ;C, der aus dem Nichts erscheint. Und das \sind /...

Was genau ist hier los?

Ich erhalte das gleiche Ergebnis in VSCodes Terminal Git Bash und Powershell.

Update: Ich habe festgestellt, dass beim .shAusführen des PowerShell-Terminals von VSCode ein separates cmd.exeKonsolenfenster geöffnet wird, in dem das Skript in Git Bash ausgeführt zu werden scheint. Dies könnte also ein Git-Bash-Problem sein.

Antworten:


126

Also fand ich mit einigem zusätzlichen Graben diese drei Threads, die mit Git-Bash zusammenhängen und Docker-Mount vermasseln:

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

Wenn ich in der Dokumentation von mingw zur Pfadkonvertierung nachschaue, die git-bash verwendet, finde ich diese Syntaxtabelle: http://www.mingw.org/wiki/Posix_path_conversion

Eine davon gibt im Format aus : x;x;C:\MinGW\msys\1.0\x. Beachten Sie das ;Cdarin. Wenn git-bash versucht, klug zu sein, die Syntax zu füllen und einen Pfad mit diesem Format auszugeben, würde dies dies erklären.

Die Lösung besteht darin, die Pfadkonvertierung durch Präfixieren mit zu umgehen /. Also der Befehl Working Docker, Docker von Git-Bash mit dem aktuellen Arbeitsverzeichnis auszuführen:

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

9
Ich stellte fest, dass ich den Pfad zusätzlich in eine Schnur "/${PWD}"
einwickeln musste

11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start Ich stellte schließlich fest, dass ich den führenden Schrägstrich mit Klammern anstelle von Klammern verwenden musste. Außerdem brauchte ich für das Arbeitsverzeichnis zwei führende Schrägstriche. Zu Ihrer
Information

Dies funktionierte für mich (unter Windows 10 Git Bash): Docker-Lauf --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <Bildname>
progonkpa

2
Lebensrettend. Windows10 und Git-Bash hier haben lange gedauert, bis ich versucht habe, Volume ohne Docker-Compose zu mounten, bis ich diesen Beitrag sehe. Nun funktioniert das : docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Vielen Dank.
Emily

LEBEN. SAVER. +1000000
Jonathan Tuzman

3

Für mich bestand die Lösung einfach darin, /am Ende eines Pfades einen abschließenden Schrägstrich einzufügen .

ZB statt

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

...verwenden

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


3

Das Mounten des aktuellen Verzeichnisses in einen Docker-Container in Windows 10 von Git Bash (MinGW) kann aufgrund einer POSIX-Pfadkonvertierung fehlschlagen. Jeder Pfad, der mit beginnt, /wird in einen gültigen Windows-Pfad konvertiert.

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

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

Um die Pfadkonvertierung zu überspringen, muss allen POSIX-Pfaden der zusätzliche führende Schrägstrich ( /) vorangestellt werden , einschließlich /$(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 wird der Pfad //data/test.txtnicht konvertiert und in Linux-Shells //(führender doppelter Schrägstrich) wird ignoriert und genauso behandelt wie /.

Deaktivieren Sie die Pfadkonvertierung

Deaktivieren Sie die POSIX-Pfadkonvertierung in Git Bash (MinGW) mithilfe der MSYS_NO_PATHCONVUmgebungsvariablen.

Die Pfadkonvertierung kann auf Befehlsebene deaktiviert werden:

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

Die Pfadkonvertierung kann auf Shell- (oder System-) Ebene deaktiviert werden:

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
Vielen Dank, dass Sie diese Lösung bereitgestellt haben, da das Entkommen bei mir nicht funktioniert hat, während die Pfadkonvertierung deaktiviert wurde.
Chanandler Bong

0

Können Sie unten Befehl versuchen -

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

0

Ich hatte tatsächlich das gleiche Problem. Je nachdem, ob Sie Git Bash verwenden, funktioniert dieser Befehl (am Beispiel von nginx):

Docker-Container ausführen - Name Containername -v `pwd -W` / html: / usr / share / nginx / html -p 8000: 80 -d nginx

Natürlich können Sie den Port und das Verzeichnis nach Ihren Wünschen angeben.


0

Ich hatte das gleiche Problem bei Git Bash und nicht bei der Eingabeaufforderung. Sie können stattdessen

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

0

Gerade für mich unten gearbeitet. Verwenden Sie einfach keine dynamische Variable.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.