Volume yang dipasang di Docker menambahkan; C ke ujung jalur windows saat menerjemahkan dari jalur gaya linux

88

Saya telah menemukan beberapa keanehan yang menarik ketika mencoba memasang gambar buruh pelabuhan di windows.

Saya membuat .shskrip yang melakukan mount folder proyek untuk menjalankan image lingkungan pengembang kami. Saya ingin satu skrip yang dapat dijalankan oleh setiap pengembang, apa pun mesinnya. Yang dilakukannya hanyalah menjalankan buruh pelabuhan dengan folder proyek saat ini.

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

Bekerja dengan baik. Sekarang rencananya adalah untuk memanggil skrip ini dari npm, jadi saya ingin ini berfungsi relatif terhadap folder saat ini. Ayo coba versi lain.

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

Gagal dengan:

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. Apa ;Cdan dari mana asalnya?

Jadi saya melakukan echo $PWDyang memberi saya /d/my/project/folder.

Menarik, jadi $PWDmemutuskan ke jalur yang benar dalam format jalur linux, dan sepertinya buruh pelabuhan mencoba menerjemahkan dari itu ke jalur jendela yang benar, kecuali ada ini ;Cyang muncul entah dari mana. Dan \yang /...

Apa sebenarnya yang terjadi disini?

Saya mendapatkan hasil yang sama di terminal git bash dan PowerShell VSCode.

Pembaruan: Saya perhatikan bahwa menjalankan .shterminal PowerShell di VSCode, membuka cmd.exejendela konsol terpisah yang tampaknya menjalankan skrip di git bash. Jadi ini mungkin masalah git bash.

Sebastian Nemeth
sumber

Jawaban:

126

Jadi dengan beberapa penggalian ekstra saya menemukan tiga utas ini, terkait dengan git-bash mucking up docker mount:

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

Ketika saya melihat dokumentasi mingw tentang jalur konversi yang digunakan git-bash, saya menemukan tabel sintaks ini: http://www.mingw.org/wiki/Posix_path_conversion

Salah satu yang output dalam format: x;x;C:\MinGW\msys\1.0\x. Perhatikan ;Cdi dalamnya. Jika git-bash mencoba untuk menjadi pintar, mengisi sintaks dan mengeluarkan jalur dengan format ini, ini akan menjelaskannya.

Solusinya adalah menghindari konversi jalur, menggunakan dengan mengawali dengan /. Jadi perintah buruh pelabuhan untuk menjalankan buruh pelabuhan dari git-bash dengan direktori kerja sekarang:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev
Sebastian Nemeth
sumber
9
Saya menemukan bahwa saya juga harus membungkus jalur menjadi string jadi"/${PWD}"
Bananaapple
11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start Saya akhirnya menemukan bahwa saya harus menggunakan garis miring di depan dengan tanda kurung, bukan tanda kurung. Juga, dengan direktori kerja saya membutuhkan dua garis miring di depan. FYI: ini adalah perintah yang saya butuhkan untuk Docker untuk Pengembang Web di
Pluralsight
Ini berhasil untuk saya (pada Windows 10 git bash): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa
2
Menyelamatkan hidup. Windows10 dan git-bash disini, butuh waktu lama bagi saya untuk mencoba volume mount tanpa menggunakan docker-compose, sampai saya melihat postingan ini. Sekarang ini bekerja: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Terima kasih.
Emily
KEHIDUPAN. PENGHEMAT. +1000000
Jonathan Tuzman
3

Bagi saya, solusinya cukup dengan memasukkan garis miring penutup /di ujung jalur mana pun .

Misalnya, bukan

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

...menggunakan

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

olisteadman
sumber
3

Memasang direktori saat ini ke kontainer Docker di Windows 10 dari Git Bash (MinGW) mungkin gagal karena konversi jalur POSIX. Jalur apa pun yang dimulai dengan /diubah menjadi jalur Windows yang valid.

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

Keluar dari jalur POSIX dengan mengawali dengan /

Untuk melewati konversi jalur, semua jalur POSIX harus diawali dengan garis miring ( /) tambahan, termasuk /$(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

Di Git Bash, jalur //data/test.txttidak diubah dan di shell Linux //(garis miring ganda di depan) diabaikan dan diperlakukan sama seperti /.

Nonaktifkan konversi jalur

Nonaktifkan konversi jalur POSIX di Git Bash (MinGW) menggunakan MSYS_NO_PATHCONVvariabel lingkungan.

Konversi jalur dapat dinonaktifkan di tingkat perintah:

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

Konversi jalur dapat dinonaktifkan di tingkat shell (atau sistem):

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
Evgeniy Khyst
sumber
2
Terima kasih telah memberikan solusi ini karena melarikan diri tidak berhasil untuk saya, sementara menonaktifkan konversi jalur berhasil.
Chanandler Bong
0

Bisakah Anda mencoba di bawah perintah -

docker run -it --rm -v %cd%:/wkDir $IMAGE_TAG yarn dev
Sujay Pillai
sumber
0

Saya sebenarnya memiliki masalah yang sama. Bergantung pada apakah Anda menggunakan Git Bash, perintah ini berfungsi (menggunakan nginx sebagai contoh):

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

tentu saja Anda dapat menentukan port dan direktori sesuai keinginan.

Obothlale
sumber
0

Saya memiliki masalah yang sama pada git bash dan bukan command prompt. Anda bisa

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

Langsung bekerja untuk saya di bawah. jangan gunakan variabel dinamis.

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
Udyan Shardhar
sumber