ติดตั้งไดเร็กทอรีปัจจุบันเป็นไดรฟ์ข้อมูลใน Docker บน Windows 10


132

ลักษณะ

ฉันใช้ Docker เวอร์ชัน 1.12.5 บน Windows 10 ผ่าน Hyper-V และต้องการใช้คอนเทนเนอร์ปฏิบัติการเป็นคำสั่งในพา ธ ปัจจุบัน ฉันสร้างอิมเมจ Docker ที่ทำงานได้ดี แต่ฉันมีปัญหาในการต่อเชื่อมเส้นทางปัจจุบัน แนวคิดคือการสร้างนามแฝงและทำdocker run --rm [...]คำสั่งเพื่อให้สามารถใช้งานได้ทั้งระบบในไดเร็กทอรีปัจจุบัน

ติดตั้ง

ฉันมีไดรฟ์ E พร้อมโฟลเดอร์ "test" และในนั้นมีโฟลเดอร์ชื่อ "folder on windows host" เพื่อแสดงว่าคำสั่งนั้นใช้งานได้ Dockerfile สร้างไดเร็กทอรี/dataกำหนดเป็น VOLUME และ WORKDIR

มีE:\testเป็นไดเรกทอรีปัจจุบันใน PowerShell และดำเนินการคำสั่งหางกับเส้นทางแน่นอนฉันสามารถดูเนื้อหาของ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

ปัญหา

ฉันต้องการใช้ไดเร็กทอรีปัจจุบันไม่ใช่สัญกรณ์สัมบูรณ์ ฉันไม่สามารถใช้ pwd ในไดรฟ์ข้อมูลได้เนื่องจากข้อความแสดงข้อผิดพลาดต่างกัน:

พยายามด้วย ($ 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'.

พยายามด้วย / ($ 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'.

ลองใช้ \´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'.

ลองใช้ "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'.

ไวยากรณ์ที่ถูกต้องในการติดตั้งไดเร็กทอรีปัจจุบันเป็นไดรฟ์ข้อมูลใน Docker บน Windows 10 คืออะไร

คำตอบ:


309

ใน Windows Command Line ( cmd) คุณสามารถติดตั้งไดเร็กทอรีปัจจุบันได้ดังนี้:

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

ใน PowerShell คุณใช้${PWD}ซึ่งให้ไดเร็กทอรีปัจจุบัน:

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

บน Linux:

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

ข้ามแพลตฟอร์ม

ตัวเลือกต่อไปนี้จะใช้ได้กับทั้ง PowerShell และบน Linux (อย่างน้อย 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

ตัวอย่าง CMD ของคุณถูกต้องและใช้งานได้ดี! ตัวแปร Power Shell ไม่ทำงานแม้ว่า $ pwd.path จะถูกต้อง แต่ก็ไม่ได้รับการแก้ไขเป็นค่าที่ถูกต้องเมื่อใช้ในสคริปต์: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}ทำงานบนระบบ Unix ด้วย (Linux, macOS) หมายเหตุ : pwd= present working directory
thiagowfx

2
@cjsimon ดูเหมือนว่าอาจมี ... ดูเหมือนว่า PowerShell รองรับ$(pwd)ซึ่งจะทำงานบน Linux ด้วย (ฉันคิดว่า - ยังไม่ทดสอบ)
ETL

13
ด้วย Git Bash สามารถเป็นwinpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9หรือwinpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos

1
ไม่ทำงานสำหรับฉันใน windows 10 การเพิ่มความสำเร็จ แต่ไดเรกทอรีเป้าหมายว่างเปล่า
J. Doem

23

สิ่งนี้ใช้ได้กับฉันใน PowerShell:

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

5
ตอนนี้ยังใช้ได้ไหม ฉันได้รับสิ่งต่อไปนี้เมื่อพยายาม: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 หากคุณใช้ Windows 10 ให้ลองใช้Docker for WindowsแทนToolboxไฟล์.
Finlay Roelofs

2
@ finlay-roelofs ขอบคุณ แต่ Docker for Win ใช้งานได้กับ Win Pro เท่านั้น
mistalaba

9

สำหรับ Git Bash สำหรับ Windows (ใน ConEmu) สิ่งต่อไปนี้ใช้ได้กับฉัน (สำหรับคอนเทนเนอร์ Docker Windows):

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

สังเกตbackticks / backquotesรอบ ๆpwd -W!

ด้วยรูปแบบอื่น ๆ ของ PWD ที่ฉันได้ลองฉันได้รับ: "Error response from daemon: invalid volume specification: ..."

อัปเดต: ด้านบนใช้สำหรับคอนเทนเนอร์ Docker Windows สำหรับคอนเทนเนอร์ Linux ใช้:

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

ไม่ได้ผลสำหรับฉันจาก cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos ไม่พบไฟล์: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

ฉันทำรวมถึง backticks และใช้งานได้ดีเมื่อใช้ gitbash สำหรับ windows
Thiago Cardoso

ฉันสามารถยืนยันได้ว่าสิ่งนี้ใช้ได้กับ hyper gitbash เช่นกันในตัวเลือกแรก
Andy

backticks เป็นวิธีที่มีประสิทธิภาพน้อยกว่าในการเรียกใช้คำสั่งฝังตัว วิธีที่ดีกว่าคือใช้ $ (command) แทน`command`
Timothy c

8
  1. เปิดการตั้งค่าบน Docker Desktop (Docker สำหรับ Windows)
  2. เลือกไดรฟ์ที่ใช้ร่วมกัน
  3. เลือกไดรฟ์ที่คุณต้องการใช้ภายในคอนเทนเนอร์ของคุณ (เช่น C)
  4. คลิกสมัคร คุณอาจถูกขอให้ระบุข้อมูลรับรองผู้ใช้ การเปิดใช้งานไดรฟ์สำหรับคอนเทนเนอร์บน Windows

  5. คำสั่งด้านล่างควรทำงานบน PowerShell แล้ว (พรอมต์คำสั่งไม่รองรับ${PWD}):

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

สำคัญ : ถ้า / เมื่อคุณเปลี่ยนรหัสผ่านโดเมน Windows การเมาท์จะหยุดทำงานโดยไม่โต้ตอบนั่นคือ-vจะใช้งานได้ แต่คอนเทนเนอร์จะไม่เห็นโฟลเดอร์และไฟล์โฮสต์ของคุณ วิธีแก้ไข : กลับไปที่การตั้งค่ายกเลิกการเลือกไดรฟ์ที่แชร์ใช้ตรวจสอบอีกครั้งใช้และป้อนรหัสผ่านใหม่เมื่อได้รับแจ้ง


2

นี่คือของฉันซึ่งเข้ากันได้กับทั้ง Win10 docker-ce & Win7 docker-toolbox ในตอนนั้นฉันกำลังเขียนสิ่งนี้ :)

คุณสามารถสังเกตได้ว่าฉันชอบใช้ / host_mnt / c แทน c: / เพราะบางครั้งฉันพบปัญหาใน docker-ce Win 10 กับ 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

ขอแสดงความคิดเห็นและยืนยันว่านี่คือคำตอบหลักล้านสำหรับ Docker Toolbox บน Windows Server 2012 !!!! เก่งมาก! สำหรับใครก็ตามที่อยากรู้ ${MOUNT_PATH}สามารถแก้ไขได้ที่/c/Program Files/Docker Toolbox
petrosmm

2

วิธีแก้ปัญหาอื่น ๆ สำหรับ Git Bash ที่ผู้อื่นให้มาไม่ได้ผลสำหรับฉัน เห็นได้ชัดว่าขณะนี้มีข้อบกพร่อง / ข้อ จำกัด ใน Git สำหรับ Windows ดูนี้และนี้

ในที่สุดฉันก็สามารถทำให้มันใช้งานได้หลังจากพบเธรด GitHub นี้ (ซึ่งมีวิธีแก้ปัญหาเพิ่มเติมหากคุณสนใจซึ่งอาจเหมาะกับคุณ แต่ไม่ใช่สำหรับฉัน)

ฉันลงเอยด้วยการใช้ไวยากรณ์ต่อไปนี้:

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

สังเกตMSYS_NO_PATHCONV=1ด้านหน้าของdockerคำสั่งและ$(pwd)- วงเล็บกลม, pwd ตัวพิมพ์เล็ก, ไม่มีเครื่องหมายคำพูด, ไม่มีแบ็กสแลช

นอกจากนี้ฉันกำลังใช้คอนเทนเนอร์ Linux บน Windows หากเป็นเช่นนั้น ..

ฉันทดสอบสิ่งนี้ใน Windows Terminal, ConEmu และ GitBash ใหม่และทั้งหมดนี้ใช้ได้กับฉัน


สวัสดีนี่ช่วยให้ฉันทำงานนี้ได้ในที่สุด คุณรู้หรือไม่ว่าทำไมเราถึงต้องการMSYS_NO_PATHCONV=1ตัวเลือกคำสั่ง? มิฉะนั้น Mount dir ปลายทางของฉันเต็มไปด้วย "c: / tools / cmder / vendor / git-for-windows"
Austin L

1

คำสั่งนี้ควรแก้ไข

นักเทียบท่าวิ่ง --rm -it -v ${PWD}:c:\datamirkohaaser / docker-clitools

{PWD} คือโฟลเดอร์ปัจจุบันของโฮสต์ หลังจาก:เป็นโฟลเดอร์คอนเทนเนอร์ หากการติดตั้งถูกต้องไฟล์จะถูกแสดงรายการในไดเร็กทอรีc:\dataในคอนเทนเนอร์


1

คุณต้องสลับเครื่องหมายทับด้านหลังทั้งหมดเพื่อเลื่อนไปข้างหน้าจึงเปลี่ยน

นักเทียบท่า -v C: \ my \ โฟลเดอร์: / mountlocation ...

ถึง

นักเทียบท่า -v C: / my / folder: / mountlocation ...

ปกติฉันจะเรียกนักเทียบท่าจากสคริปต์ cmd ที่ฉันต้องการให้โฟลเดอร์เมาท์สัมพันธ์กับสคริปต์ที่ฉันเรียกดังนั้นในสคริปต์นั้นฉันทำสิ่งนี้ ...

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

1

พร้อมรับคำสั่ง ( Cmd.exe)

เมื่อใช้ Docker CLI จาก Windows Cmd.exeให้ใช้%cd%เพื่อต่อเชื่อมไดเร็กทอรีปัจจุบัน:

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

Git Bash (MinGW)

เมื่อเทียบท่า CLI ถูกนำมาใช้จาก Git Bash (MinGW) ติดตั้งไดเรกทอรีปัจจุบันอาจล้มเหลวเนื่องจากการแปลงเส้นทาง POSIX: หางติดปริมาณเพิ่ม; C ถึงปลายหน้าต่างเส้นทางเมื่อแปลจากเส้นทางสไตล์ลินุกซ์

หลีกหนีเส้นทาง POSIX โดยนำหน้าด้วย /

หากต้องการข้ามการแปลงเส้นทางพา ธ POSIX จะต้องขึ้นต้นด้วยเครื่องหมายทับ ( /) เพื่อให้มีเครื่องหมายทับคู่ ( //) นำหน้ารวมถึง/$(pwd)

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

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

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

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

หรือระดับเชลล์ (ระบบ)

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 ทุบตี

 cd /c/Users/Christian/manager
    docker run --rm -v  ${PWD}:/app  --workdir=/app  php:7.2-cli php  bin/app.php

echo ${PWD} ผลลัพธ์:

/ C / ผู้ใช้ / คริสเตียน / ผู้จัดการ

cmdหรือPowerShell

  cd C:\Users\Christian\manager

echo ${PWD} ผลลัพธ์:

เส้นทาง ---- C: \ Users \ Christian \ manager

ตามที่เราเห็นในcmdหรือPowerShell $ {PWD} จะไม่ทำงาน


4
นอกจากนี้โปรดเขียนคำอธิบายวิธีแก้ปัญหาของคุณเป็นภาษาอังกฤษ ซึ่งจะช่วยต่อสู้กับความเข้าใจผิดที่ว่า StackOverflow เป็นบริการเขียนโค้ดฟรี
Yunnosch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.