विंडोज 10 पर डॉकर में वॉल्यूम के रूप में वर्तमान निर्देशिका माउंट करें


132

विवरण

मैं हाइपर-वी के माध्यम से विंडोज 10 पर डॉकर संस्करण 1.12.5 का उपयोग कर रहा हूं और वर्तमान पथ में कमांड के रूप में कंटेनर निष्पादन योग्य का उपयोग करना चाहता हूं। मैंने एक डॉकर छवि बनाई जो ठीक चल रही है, लेकिन मुझे वर्तमान पथ को माउंट करने के लिए एक समस्या है। विचार एक उपनाम बनाने और एक docker run --rm [...]कमांड करने का है ताकि वर्तमान निर्देशिका में सिस्टम-वाइड का उपयोग किया जा सके।

सेट अप

मेरे पास एक फ़ोल्डर "परीक्षण" के साथ एक ड्राइव ई है और वहां एक फ़ोल्डर जिसे "विंडोज़ होस्ट पर फ़ोल्डर" कहा जाता है यह दिखाने के लिए कि कमांड काम कर रहा है। Dockerfile डायरेक्टरी बनाता है /data, इसे VOLUME और WORKDIR के रूप में परिभाषित करता है।

E:\testPowerShell में वर्तमान निर्देशिका के रूप में होने और डॉकर कमांड को एक पूर्ण पथ के साथ निष्पादित करने पर, मैं इसकी सामग्री देख सकता हूं 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'.

\ Ingpwd \ Try के साथ प्रयास कर रहा है

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'.

विंडोज 10 पर डॉकर में एक वॉल्यूम के रूप में वर्तमान निर्देशिका को माउंट करने का सही सिंटैक्स क्या है?

जवाबों:


308

विंडोज कमांड लाइन ( 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

लिनक्स पर:

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

क्रास प्लेटफार्म

निम्न विकल्प PowerShell और Linux (कम से कम उबंटू) दोनों पर काम करेंगे:

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 के लिए आपका उदाहरण सही है और बढ़िया काम करता है! पावर शेल संस्करण काम नहीं करता है, हालांकि $ pwd.path अपने आप में सही है, यह स्क्रिप्ट में उपयोग किए जाने पर सही मान पर हल नहीं होता है: gist.github.com/McGo/8924cc5b0609f1399092554a0bef183
McGo

3
${PWD}यूनिक्स सिस्टम पर भी काम करता है (लिनक्स, macOS)। नोट : pwd= वर्तमान कार्यशील निर्देशिका
थियागॉफ़ेक्स

2
@cjsimon यह वास्तव में ऐसा लगता है कि हो सकता है ... ऐसा लगता है जैसे PowerShell समर्थन $(pwd)जो लिनक्स पर भी काम करेगा (मुझे लगता है - अप्रकाशित)
ETL

13
गिट बैश के साथ यह 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
किताकोस

1
विंडोज़ 10 पर मेरे लिए काम नहीं करना, सफलता बढ़ाना लेकिन लक्ष्य निर्देशिका खाली है
जे। 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'.
मिलते हैं

@ मिस्तलाबा यदि आप विंडोज 10 का उपयोग कर रहे हैं, तो Docker for Windowsइसके बजाय का उपयोग करने का प्रयास करें Toolbox
फिनेले रूलोफ्स

2
@ फिनाले-रूलोफ्स थैंक्स, लेकिन विन के लिए डॉकर केवल विन प्रो के साथ काम करता है।
मिस्टालबा

9

Windows (ConEmu में) के लिए Git बैश के लिए, मेरे लिए निम्न काम करता है (Docker Windows कंटेनरों के लिए):

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

चारों ओर backticks / backquotes पर ध्यान दें pwd -W!

पीडब्लूडी के अन्य सभी बदलावों के साथ मैंने कोशिश की है कि मैंने प्राप्त किया है: "Error response from daemon: invalid volume specification: ..."

अद्यतन: ऊपर डोकर विंडोज कंटेनरों के लिए था, लिनक्स कंटेनरों के लिए:

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 / seller /it-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

मैंने बैकटिक्स सहित, और खिड़कियों के लिए गिटबश का उपयोग करके ठीक काम किया
थियागो

मैं यह पुष्टि कर सकता हूं कि यह हाइपर गिटबश के साथ-साथ पहले विकल्प पर भी काम करता है
एंडी

बैकटिक्स एक एम्बेडेड कमांड को निष्पादित करने का एक कम कुशल तरीका है। इसके बजाय $ (कमांड) का उपयोग करने का बेहतर तरीका है`command`
टिमोथी c

8
  1. Docker Desktop (विंडोज के लिए Docker) पर सेटिंग्स खोलें ।
  2. साझा ड्राइव का चयन करें ।
  3. उस ड्राइव का चयन करें जिसे आप अपने कंटेनरों (जैसे, C) के अंदर उपयोग करना चाहते हैं।
  4. अप्लाई पर क्लिक करें । आपको उपयोगकर्ता क्रेडेंशियल्स प्रदान करने के लिए कहा जा सकता है। विंडोज पर कंटेनरों के लिए ड्राइव सक्षम करना

  5. नीचे दी गई कमांड को अब PowerShell पर काम करना चाहिए (कमांड प्रॉम्प्ट समर्थन नहीं करता है ${PWD}):

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

महत्वपूर्ण : यदि / जब आप अपना विंडोज़ डोमेन पासवर्ड बदलते हैं, तो माउंट चुपचाप काम करना बंद कर देगा , अर्थात -vकाम करेगा लेकिन कंटेनर आपके होस्ट फ़ोल्डर और फ़ाइलों को नहीं देखेगा। समाधान : सेटिंग पर वापस जाएं, साझा किए गए ड्राइव को अनचेक करें , लागू करें , उन्हें फिर से जांचें, लागू करें , और संकेत दिए जाने पर नया पासवर्ड दर्ज करें।


2

यहाँ मेरा है जो दोनों Win10 docker-ce और Win7 docker-toolbox के लिए संगत है। लास में उस समय मैं यह लिख रहा हूँ :)।

आप देख सकते हैं कि मैं c के बजाय / host_mnt / 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

टिप्पणी करना चाहते हैं और पुष्टि करते हैं कि यह विंडोज सर्वर 2012 पर डॉकर टूलबॉक्स के लिए एक मिलियन डॉलर का उत्तर है !!!! बहुत ही उत्तम कार्य! किसी की जिज्ञासा के लिए, ${MOUNT_PATH}के रूप में हल/c/Program Files/Docker Toolbox
petrosmm

2

अन्य द्वारा प्रदान किए गए गिट बैश के अन्य समाधान मेरे लिए काम नहीं करते थे। वर्तमान में विंडोज के लिए गिट में एक बग / सीमा है। यह और यह देखें ।

मैं आखिरकार इस GitHub धागे को खोजने के बाद काम करने में कामयाब रहा (जो आपकी रुचि के अनुसार कुछ अतिरिक्त समाधान प्रदान करता है, जो आपके लिए काम कर सकता है, लेकिन मेरे लिए नहीं)।

मैंने निम्नलिखित सिंटैक्स का उपयोग करके समाप्त किया:

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

कमांड के MSYS_NO_PATHCONV=1सामने नोट करें dockerऔर $(pwd)- राउंड ब्रैकेट, लोअर-केस pwd, नो कोट्स, नो बैकस्लैश।

इसके अलावा, अगर मैं विंडोज पर लिनक्स कंटेनरों का उपयोग कर रहा हूं तो यह मायने रखता है।

मैंने नए विंडोज टर्मिनल, कॉनमू और जीटबैश में यह परीक्षण किया, और उन सभी ने मेरे लिए काम किया।


हैलो, इससे मुझे यह काम करने में मदद मिली। क्या आप जानते हैं कि हमें MSYS_NO_PATHCONV=1कमांड विकल्प की आवश्यकता क्यों है? अन्यथा मेरा गंतव्य माउंट डीआईआर "सी: / टूल्स / सेमीडर / वेंडर / गिट-फॉर-विंडो" से भर गया
ऑस्टिन एल

1

इस कमांड को इसे ठीक करना चाहिए।

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

{PWD} होस्ट करंट फ़ोल्डर है। के बाद :कंटेनर फ़ोल्डर है। यदि माउंटिंग सही है, तो c:\dataकंटेनर में फाइलें निदेशक में सूचीबद्ध की जाएंगी ।


1

इतना बदलाव करने के लिए आपको आगे के सभी स्लैश को स्वैप करना होगा

docker -v C: \ my \ फ़ोल्डर: / पर्वतारोहण ...

सेवा

docker -v C: / my / फ़ोल्डर: / पर्वतारोहण ...

मैं आम तौर पर एक 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)

जब विंडोज से डॉकर सीएलआई का उपयोग किया जाता है Cmd.exe, %cd%तो वर्तमान निर्देशिका को माउंट करने के लिए उपयोग करें:

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

Git Bash (MINGW)

डोकर CLI Git बैश (MinGW) से प्रयोग किया जाता है, वर्तमान निर्देशिका बढ़ते एक POSIX पथ रूपांतरण के कारण विफल हो सकता है: डोकर घुड़सवार मात्रा कहते हैं, जब linux शैली पथ से अनुवाद सी खिड़कियों पथ के अंत करने के लिए

POSIX रास्तों के साथ उपसर्ग करके बच जाएं /

पथ रूपांतरण को छोड़ने के लिए, POSIX रास्तों को स्लैश के साथ उपसर्ग /करना पड़ता है ( //) जिसमें प्रमुख दोहरे स्लैश होते हैं ( ), सहित/$(pwd)

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

पथ रूपांतरण अक्षम करें

MSYS_NO_PATHCONV=1कमांड स्तर पर पर्यावरण चर सेट करके Git Bash (MinGW) में POSIX पथ रूपांतरण अक्षम करें

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

गिट बाश

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

echo ${PWD} परिणाम:

/ सी / उपयोगकर्ता / ईसाई / प्रबंधक

cmd या पॉवरशेल

  cd C:\Users\Christian\manager

echo ${PWD} परिणाम:

पथ ---- C: \ Users \ Christian \ Manager

जैसा कि हम cmd या PowerShell $ {PWD} में देखते हैं, काम नहीं करेगा


4
इसके अलावा, अंग्रेजी में, कृपया अपने समाधान की व्याख्या लिखें। यह गलत धारणा से लड़ने में मदद करेगा कि StackOverflow एक मुफ्त कोड लेखन सेवा है।
युनानोश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.