เพิ่มวอลลุ่มที่ติดตั้ง Docker; C ไปที่จุดสิ้นสุดของเส้นทาง windows เมื่อแปลจากเส้นทางสไตล์ลินุกซ์


88

ฉันพบความแปลกที่น่าสนใจเมื่อพยายามติดตั้งภาพนักเทียบท่าบน windows

ฉันสร้าง.shสคริปต์ที่ติดตั้งโฟลเดอร์โครงการเพื่อเรียกใช้อิมเมจสภาพแวดล้อมสำหรับนักพัฒนาของเรา ฉันต้องการหนึ่งสคริปต์ที่ทุก dev สามารถเรียกใช้โดยไม่คำนึงถึงเครื่องของพวกเขา เพียงแค่เรียกใช้นักเทียบท่าด้วยโฟลเดอร์โครงการปัจจุบัน

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

ทำงานได้ดี ตอนนี้แผนคือการเรียกสคริปต์นี้จากnpmดังนั้นฉันต้องการให้สิ่งนี้ทำงานโดยสัมพันธ์กับโฟลเดอร์ปัจจุบัน ลองรุ่นอื่น

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

ล้มเหลวด้วย:

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.

วัด. อะไร;Cและสถานที่ที่มันมาจากไหน?

ดังนั้นผมจึงทำซึ่งทำให้ผมecho $PWD/d/my/project/folder

น่าสนใจดังนั้นจึง$PWDแก้ไขไปยังเส้นทางที่ถูกต้องในรูปแบบเส้นทาง linux และดูเหมือนว่านักเทียบท่ากำลังพยายามแปลจากนั้นเป็นเส้นทาง windows ที่ถูกต้องยกเว้นมีสิ่งนี้;Cที่ไม่ปรากฏที่ไหน และ\มี/...

เกิดอะไรขึ้นที่นี่?

ฉันได้ผลลัพธ์เดียวกันใน terminal git bash และ powershell ของ VSCode

อัปเดต: ฉันสังเกตเห็นว่าการเรียกใช้.shเทอร์มินัล powershell ของ VSCode เปิดcmd.exeหน้าต่างคอนโซลแยกต่างหากซึ่งดูเหมือนว่าจะเรียกใช้สคริปต์ใน git bash นี่อาจเป็นปัญหา git bash

คำตอบ:


126

ดังนั้นด้วยการขุดเพิ่มเติมฉันพบสามเธรดเหล่านี้ซึ่งเกี่ยวข้องกับ git-bash ที่ทำให้เมาท์นักเทียบท่า

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

เมื่อฉันค้นหาเอกสารของ mingw เกี่ยวกับการแปลงเส้นทางที่ใช้ git-bash ฉันพบตารางไวยากรณ์นี้: http://www.mingw.org/wiki/Posix_path_conversion

หนึ่งในผลลัพธ์ในรูปแบบ: x;x;C:\MinGW\msys\1.0\x. จดบันทึก;Cไว้ หาก git-bash พยายามที่จะฉลาดการยัดไวยากรณ์และแสดงเส้นทางด้วยรูปแบบนี้สิ่งนี้จะอธิบายได้

วิธีแก้ไขคือการหลีกเลี่ยงการแปลงเส้นทางโดยใช้โดยนำหน้าด้วย/. ดังนั้นคำสั่งนักเทียบท่าที่ใช้งานได้เพื่อเรียกใช้นักเทียบท่าจาก git-bash ด้วยไดเรกทอรีการทำงานปัจจุบัน:

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

9
ฉันพบว่าฉันต้องพันเส้นทางเพิ่มเติมเป็นสตริงดังนั้น"/${PWD}"
Bananaapple

11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start ในที่สุดฉันก็พบว่าฉันต้องใช้เครื่องหมายทับกับวงเล็บแทนการจัดฟัน นอกจากนี้ด้วยไดเร็กทอรีการทำงานฉันต้องการเครื่องหมายทับสองตัว FYI: นี่คือคำสั่งที่ฉันต้องการสำหรับนักเทียบท่าสำหรับนักพัฒนาเว็บบน Pluralsight
Andy2K11

สิ่งนี้ใช้ได้ผลสำหรับฉัน (บน Windows 10 git bash): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa

2
ช่วยชีวิต. Windows10 และ git-bash ที่นี่ฉันใช้เวลานานพอสมควรในการลองติดตั้งไดรฟ์ข้อมูลโดยไม่ใช้นักเทียบท่าเขียนจนกว่าฉันจะเห็นโพสต์นี้ ตอนนี้ใช้งานได้: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. ขอขอบคุณ.
Emily

ชีวิต. ประหยัด +1000000
Jonathan Tuzman

3

สำหรับผมแก้ปัญหาได้ก็จะรวมเฉือนปิด/ในตอนท้ายของเส้นทางใด

เช่นแทนที่จะเป็น

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

...ใช้

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


3

การติดตั้งไดเร็กทอรีปัจจุบันลงในคอนเทนเนอร์ Docker ใน Windows 10 จาก Git Bash (MinGW) อาจล้มเหลวเนื่องจากการแปลงเส้นทาง POSIX เส้นทางใด ๆ ที่ขึ้นต้นด้วย/จะถูกแปลงเป็นเส้นทาง Windows ที่ถูกต้อง

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

หลีกเลี่ยงพา ธ POSIX โดยนำหน้าด้วย /

หากต้องการข้ามแปลงเส้นทางทุกเส้นทาง POSIX ต้องนำหน้าด้วยเครื่องหมายทับชั้นนำพิเศษ ( /) /$(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

ใน Git Bash เส้นทาง//data/test.txtจะไม่ถูกแปลงและในลินุกซ์เชลล์//(เครื่องหมายทับคู่นำหน้า) จะถูกละเว้นและปฏิบัติเช่นเดียวกับ/.

ปิดการแปลงเส้นทาง

ปิดใช้งานการแปลงเส้นทาง POSIX ใน Git Bash (MinGW) โดยใช้MSYS_NO_PATHCONVตัวแปรสภาพแวดล้อม

การแปลงเส้นทางสามารถปิดใช้งานได้ที่ระดับคำสั่ง:

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

การแปลงเส้นทางสามารถปิดใช้งานได้ที่ระดับเชลล์ (หรือระบบ):

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
ขอขอบคุณที่ให้วิธีแก้ปัญหานี้เนื่องจากการหลีกเลี่ยงไม่ได้ผลสำหรับฉันในขณะที่การปิดใช้งานการแปลงเส้นทางทำได้
Chanandler Bong


0

ฉันมีปัญหาเดียวกันจริงๆ ขึ้นอยู่กับว่าคุณใช้ Git Bash คำสั่งนี้ใช้งานได้หรือไม่ (โดยใช้ nginx เป็นตัวอย่าง):

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

แน่นอนคุณสามารถระบุพอร์ตและไดเร็กทอรีได้ตามที่คุณต้องการ


0

ฉันมีปัญหาเดียวกันกับ git bash และไม่พร้อมรับคำสั่ง คุณสามารถแทน

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

0

ตรงทำงานให้ฉันด้านล่าง อย่าใช้ตัวแปรแบบไดนามิก

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.