Gắn thư mục hiện tại dưới dạng một ổ đĩa trong Docker trên Windows 10


132

Sự miêu tả

Tôi đang sử dụng Docker phiên bản 1.12.5 trên Windows 10 thông qua Hyper-V và muốn sử dụng các tệp thực thi vùng chứa làm lệnh trong đường dẫn hiện tại. Tôi đã tạo một hình ảnh Docker đang chạy tốt, nhưng tôi gặp sự cố khi gắn đường dẫn hiện tại. Ý tưởng là tạo một bí danh và thực hiện một docker run --rm [...]lệnh để nó có thể được sử dụng trên toàn hệ thống trong thư mục hiện tại.

Thiết lập

Tôi có một ổ đĩa E với một thư mục "kiểm tra" và trong đó một thư mục được gọi là "thư mục trên máy chủ windows" để hiển thị rằng lệnh đang hoạt động. Dockerfile tạo thư mục /data, định nghĩa nó là VOLUME và WORKDIR.

E:\testthư mục hiện tại trong PowerShell và thực thi lệnh Docker với một đường dẫn tuyệt đối, tôi có thể thấy nội dung của 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

Vấn đề

Tôi muốn sử dụng thư mục hiện tại và không phải là một ký hiệu tuyệt đối. Tôi không thể sử dụng pwd trong tập vì các thông báo lỗi khác nhau:

Đang thử với ($ 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'.

Đang thử với / ($ 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'.

Đang thử với \ ´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'.

Đang thử với `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'.

Cú pháp chính xác của việc gắn thư mục hiện tại dưới dạng ổ đĩa trong Docker trên Windows 10 là gì?

Câu trả lời:


308

Trong Windows Command Line ( cmd), bạn có thể gắn kết thư mục hiện tại như sau:

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

Trong PowerShell, bạn sử dụng ${PWD}, cung cấp cho bạn thư mục hiện tại:

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

Trên Linux:

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

Nền tảng chéo

Các tùy chọn sau sẽ hoạt động trên cả PowerShell và Linux (ít nhất là 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

Ví dụ của bạn cho CMD là đúng và hoạt động tuyệt vời! Biến thể Power Shell không hoạt động, mặc dù bản thân $ pwd.path là đúng, nhưng nó không được giải quyết thành giá trị chính xác khi được sử dụng trong tập lệnh: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}cũng hoạt động trên hệ thống Unix (Linux, macOS). Lưu ý : pwd= thư mục làm việc hiện tại
thiagowfx

2
@cjsimon Nó thực sự trông giống như có thể có ... có vẻ như PowerShell hỗ trợ $(pwd)mà sẽ còn làm việc trên Linux (Tôi nghĩ rằng - chưa được kiểm tra)
ETL

13
Với Git Bash, nó có thể là winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9hoặc winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos

1
không hoạt động đối với tôi trên windows 10, gắn kết thành công nhưng thư mục đích trống
J. Doem

23

Điều này phù hợp với tôi trong PowerShell:

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

5
Điều này vẫn còn giá trị? Tôi nhận được những điều sau đây khi thử: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 Nếu bạn đang sử dụng Windows 10, hãy thử sử dụng Docker for Windowsthay vì Toolbox.
Finlay Roelofs,

2
@ finlay-roelofs Cảm ơn, nhưng Docker cho Win chỉ hoạt động với Win Pro.
mistalaba,

9

Đối với Git Bash dành cho Windows (trong ConEmu), những điều sau phù hợp với tôi (đối với vùng chứa Docker Windows):

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

Lưu ý các dấu ngoặc kép / dấu ngoặc kép xung quanhpwd -W !

Với tất cả các biến thể khác của PWD mà tôi đã thử, tôi đã nhận được: "Error response from daemon: invalid volume specification: ..."

Cập nhật: Ở trên dành cho vùng chứa Docker Windows, dành cho vùng chứa Linux sử dụng:

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

Không hoạt động đối với tôi từ cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Không tìm thấy tệp: C: / tools / cmder / provider /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

Tôi đã làm, bao gồm cả backticks, và nó làm việc tốt bằng gitbash cho các cửa sổ
Thiago Cardoso

Tôi có thể khẳng định rằng đây làm việc với siêu gitbash cũng vào tùy chọn đầu tiên
Andy

Các dấu gạch ngược là một cách kém hiệu quả hơn để thực hiện một lệnh nhúng. Cách tốt hơn là sử dụng $ (lệnh) chứ không phải là`command`
Timothy c

8
  1. Mở Cài đặt trên Docker Desktop (Docker cho Windows).
  2. Lựa chọn chung .
  3. Chọn ổ đĩa mà bạn muốn sử dụng bên trong vùng chứa của mình (ví dụ: C).
  4. Nhấp vào Áp dụng . Bạn có thể được yêu cầu cung cấp thông tin đăng nhập của người dùng. Bật ổ đĩa cho vùng chứa trên Windows

  5. Lệnh bên dưới bây giờ sẽ hoạt động trên PowerShell (dấu nhắc lệnh không hỗ trợ ${PWD}):

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

QUAN TRỌNG : nếu / khi bạn thay đổi mật khẩu miền Windows của mình, mount sẽ ngừng hoạt động âm thầm , tức là -vsẽ hoạt động nhưng vùng chứa sẽ không nhìn thấy các thư mục và tệp máy chủ của bạn. Giải pháp : quay lại Cài đặt, bỏ chọn các bộ nhớ dùng chung, Áp dụng , kiểm tra lại chúng, Áp dụng và nhập mật khẩu mới khi được nhắc.


2

Đây là của tôi tương thích cho cả docker-ce và docker-toolbox Win7. Tại las vào thời điểm tôi đang viết cái này :).

Bạn có thể nhận thấy rằng tôi thích sử dụng / host_mnt / c thay vì c: / vì đôi khi tôi gặp sự cố trên docker-ce Win 10 với 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

Muốn bình luận và xác nhận rằng đây là câu trả lời triệu đô cho Hộp công cụ Docker trên Windows Server 2012 !!!! Công việc tuyệt vời! Đối với sự tò mò của bất kỳ ai, ${MOUNT_PATH}giải quyết như/c/Program Files/Docker Toolbox
petrosmm

2

Các giải pháp khác cho Git Bash do những người khác cung cấp không phù hợp với tôi. Rõ ràng là hiện có một lỗi / hạn chế trong Git cho Windows. Xem cái nàycái này .

Cuối cùng tôi đã quản lý để làm cho nó hoạt động sau khi tìm thấy chuỗi GitHub này (cung cấp một số giải pháp bổ sung nếu bạn quan tâm, có thể phù hợp với bạn, nhưng không phù hợp với tôi).

Tôi đã sử dụng cú pháp sau:

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

Lưu ý MSYS_NO_PATHCONV=1phía trước của dockerlệnh và$(pwd) - dấu ngoặc tròn, pwd viết thường, không có dấu ngoặc kép, không có dấu gạch chéo ngược.

Ngoài ra, tôi đang sử dụng vùng chứa Linux trên Windows nếu điều đó quan trọng ..

Tôi đã thử nghiệm điều này trong Windows Terminal mới, ConEmu và GitBash và tất cả chúng đều phù hợp với tôi.


Xin chào, điều này đã giúp tôi cuối cùng làm việc này. Bạn có biết tại sao chúng ta cần MSYS_NO_PATHCONV=1tùy chọn lệnh không? Nếu không thì mount dir đích của tôi đã bị lấp đầy bởi "c: / tools / cmder / vendor / git-for-windows"
Austin L

1

Lệnh này sẽ sửa nó.

docker run --rm -it -v ${PWD}:c:\data mirkohaaser / docker-clitools

{PWD} là thư mục lưu trữ hiện tại. sau :là thư mục chứa. Nếu việc gắn kết là chính xác thì các tệp sẽ được liệt kê trong giám đốc c:\datatrong vùng chứa.


1

Bạn cần hoán đổi tất cả các dấu gạch chéo phía sau thành dấu gạch chéo phía trước, vì vậy hãy thay đổi

docker -v C: \ my \ folder: / mountlocation ...

đến

docker -v C: / my / folder: / mountlocation ...

Tôi thường gọi docker từ một tập lệnh cmd trong đó tôi muốn thư mục gắn kết có liên quan đến tập lệnh mà tôi đang gọi nên trong tập lệnh đó, tôi thực hiện điều này ...

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

0

Dấu nhắc lệnh ( Cmd.exe)

Khi Docker CLI được sử dụng từ Windows Cmd.exe, hãy sử dụng %cd%để gắn kết thư mục hiện tại:

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

Git Bash (MinGW)

Khi Docker CLI được sử dụng từ Git Bash (MinGW), việc gắn thư mục hiện tại có thể không thành công do chuyển đổi đường dẫn POSIX: Docker mount volume thêm; C vào cuối đường dẫn windows khi dịch từ đường dẫn kiểu linux .

Thoát khỏi các đường dẫn POSIX bằng cách bắt đầu bằng /

Để bỏ qua chuyển đổi đường dẫn, đường dẫn POSIX phải có tiền tố là dấu gạch chéo ( /) để có dấu gạch chéo kép ở đầu ( //), bao gồm/$(pwd)

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

Tắt chuyển đổi đường dẫn

Tắt chuyển đổi đường dẫn POSIX trong Git Bash (MinGW) bằng cách đặt MSYS_NO_PATHCONV=1biến môi trường ở cấp lệnh

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

hoặc cấp shell (hệ thống)

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 bash

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

echo ${PWD} kết quả:

/ c / Người dùng / Christian / quản lý

cmd hoặc PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} kết quả:

Đường dẫn ---- C: \ Users \ Christian \ manager

như chúng ta thấy trong cmd hoặc PowerShell $ {PWD} sẽ không hoạt động


4
Ngoài ra, bằng tiếng Anh, vui lòng viết giải thích về giải pháp của bạn. Điều đó sẽ giúp chống lại quan niệm sai lầm rằng StackOverflow là một dịch vụ viết mã miễn phí.
Yunnosch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.