Docker kapsayıcısına bir ana bilgisayar dizini bağlama


618

Ana bilgisayarda yapılan tüm güncelleştirmelerin Docker kaplarına yansıtılması için bir ana bilgisayar dizinini Docker kapsayıcısına bağlamaya çalışıyorum.

Nerede yanlış bir şey yapıyorum. İşte yaptığım şey:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root@0f17e2313a46:/test_container# exit exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • Boot2docker sürümünü nasıl kontrol edeceğimi bilmiyorum

Sorular, karşılaşılan sorunlar:

  1. Main_folder'ı docker kapsayıcısında bulunan test_container klasörüne nasıl bağlayabilirim?
  2. Bunu otomatik olarak yapmam gerek. Gerçekten run -d -vkomutu kullanmadan bunu nasıl yapabilirim ?
  3. Boot2docker çökerse ne olur? Docker dosyaları nerede saklanır (Dockerfile dışında)?

2
Bilginize, bu yorumdan beri bu docker sabit gibi görünüyor. Mac bilgisayarımda boot2docker kullanıyorum. -V seçeneğini kullanabilir ve yerel dizinim kapsayıcıya tümüyle bağlanır.
Marco

Yanıtlar:


509

Bunu yapmanın birkaç yolu vardır. Bunu yapmanın en basit yolu dockerfile ADDkomutunu şu şekilde kullanmaktır :

ADD . /path/inside/docker/container

Ancak, dockerfile dosyası oluşturulduktan sonra ana bilgisayarda bu dizinde yapılan hiçbir değişiklik kapta görünmez. Bunun nedeni, bir konteyner oluştururken docker'ın dizini a sıkıştırması .tarve bu içeriği konteynere kalıcı olarak yüklemesidir .

Bunu yapmanın ikinci yolu, bir birimi bağlamak olan girişiminizdir. Mümkün olduğunca portatif olmaya çalıştığından, bir ana bilgisayar dizinini bir dockerfile içindeki bir docker kapsayıcı diziniyle eşleştiremezsiniz, çünkü ana bilgisayar dizini, üzerinde çalıştığınız makineye bağlı olarak değişebilir. Bir ana bilgisayar dizinini bir docker kapsayıcı dizinine eşlemek için, -vdocker çalıştırmayı şu şekilde kullanırken bayrağı kullanmanız gerekir :

docker run -v /host/directory:/container/directory -other -options image_name command_to_run

Bu kishore $ docker -v / Users / kishore / main_folder: / test_container Docker sürüm 0.9.1, 867b2a9 kishore $ docker run -v / Users / kishore / main_folder gibi denedim Kullanım: docker run [OPTIONS] IMAGE [ COMMAND] [ARG ...] Yeni bir kapsayıcıda komut çalıştır -P, --publish-all = false: Açıkta kalan tüm bağlantı noktalarını ana bilgisayar arabirimlerine yayınla -a, --attach = []: stdin, stdout veya stderr. -c, --cpu-hisseleri = 0: CPU paylaşımları (göreceli ağırlık)
Kishore Vaishnav

2
ikiniz de ekleyebilir misiniz? ve -v ses seviyesi aynı anda. bir ana bilgisayar bağlantısı belirtmezseniz varsayılan app_dir kullanılır?
alexzg

@alexzg Sadece ilk önceliğe sahip olabileceğimizi düşünmüyorum. Ayrıca, 2. nokta varsayılan app_dir ... host mount .. hakkında net değilim?
Kishore Vaishnav

35
Bu benim için docker-makine ve VirtualBox ile mac os x üzerinde çalıştı. Deneme yanılma yoluyla keşfettiğim bir uyarı, ana bilgisayar dizininin göreli bir yol değil tam bir yol olması gerektiğidir.
jbustamovej

25
ADD"montaj" yapmıyorsa, dosyayı içinde saklanan kaba kopyalar.
kev

200

Bu sorunun kullanıcısı kullanıyordu Docker version 0.9.1, build 867b2a9, size docker sürümü> = 17.06 için bir cevap vereceğim.

İstediğiniz, yerel dizini kapsayıcı dizini içinde eşitlenmiş halde tutmak, birimi tür ile birleştirerek gerçekleştirilir bind. Bu, kaynak (sisteminiz) ve hedef (docker kapsayıcısındaki) dizinleri bağlayacaktır. Linux'a bir dizin takmakla neredeyse aynı.

Docker belgelerine göre , mountyerine monte etmek için uygun komut şimdi -v. İşte belgeleri:

  • --mount: Virgülle ayrılmış birden çok anahtar / değer çifti içerir. Her anahtar / değer çifti bir <key>=<value>tuple biçimini alır . --mountSözdizimi fazla ayrıntılı olduğu -vya --volumeama tuşların sırası önemli değildir ve bayrağın değerini anlamak kolaydır.

  • typeOlabilir montaj ait bind, volumeya tmpfs. ( Bağlama kullanacağız )

  • sourceMount. Bağlama bağları için bu, Docker arka plan programı ana bilgisayarındaki dosya veya dizinin yoludur. sourceVeya olarak belirtilebilir src.

  • destinationDeğeri olarak dosya ya da dizin kap içinde monte edilecek yol alır. Olarak belirtilebilir destination, dstya da target.

Bu nedenle, geçerli dizini (kaynak) /test_container(target) ile bağlamak için kullanacağız:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

Bu bağlama parametrelerinin boşlukları varsa, tırnak içine almalısınız. Yapmadıklarını bildiğimde `pwd`bunun yerine şunu kullanırdım:

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

Ayrıca dosya izni ile uğraşmak zorunda kalacaksınız, bu makaleye bakın .


2
Cevabınızı onayladım çünkü ne kadar özlü olduğunu ve yanlış olmadığını seviyorum, ancak stackoverflow.com/a/51829247/901899
rainabba

2
Sanırım bu cevaptan beri belgeler güncellendi, çünkü şu anda bağlar yerine hacimler öneriliyor gibi görünüyor. Yine de gitmeye değer, bir şey yapmadan önce.
Sipty

1
@Sipty aşağıdakilere atıfta bulunabilir: " Yeni Docker uygulamaları geliştiriyorsanız, bunun yerine adlandırılmış birimleri kullanmayı düşünün .
Bağlayıcı

81

2 ardışık bağlar: Sanırım burada birçok yazı iki boot2docker kullanıyor olabilir, hiçbir şey görmemenizin nedeni, ana makinenizden değil, boot2docker'dan bir dizin bağlamanızdır.

Temel olarak birbirini takip eden 2 yuvaya ihtiyacınız vardır:

ana makinenizden sisteminize bir dizin bağlayan ilk dizin

ikinci dizini boot2docker'dan konteynerinize şu şekilde bağlayan ikinci dizin:

  • 1) Yerel sistemi monte edin boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) boot2dockerDosyayı linux konteynerine monte edin

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

Sonra lsiçinizdeki containerfolderiçeriği göreceksiniz hostfolder.


1
En iyi cevap. Ben (pencerelerin altında) eklemek zorunda hostfolder içinde monte komutu bir klasör paylaşım adında refering. net shareWindows terminalinde (cmd) bir komutla görünen komut. Ve bunu virtualBox GUI ile paylaşılan bir klasör olarak eklemeniz gerekir (mantığımı takip ediyorsanız aynı adı kullanarak). Paylaşmayı ihmal ederseniz, işe yarayacak, ancak izinlerle ve yenileme performanslarıyla ilgili sorunlarla karşılaşacaksınız.
Kir Kanos

mount komutu / boot2dockerfolder öğesinin bulunduğu ana bilgisayarı nasıl tanır?
alfonsodev

Hata aldım:, mount: unknown filesystem type 'vboxsf'bir ubuntu konuk ve ev sahibi kullanarak
nnyby

"vboxsf", VirtualBox paylaşılan klasör "dosya sistemi" sürücüsüdür. VirtualBox uzantıları kurularak VM'ye yapılandırılmalıdır. Boot2docker görüntüsünde bunlar yüklü olmamalıdır. VirtualBox, VirtualBox Additions ISO görüntülerini sanal birim olarak "eklemek" için bir "cihaz" fonksiyonuna sahiptir. Genellikle mount / dev / cdrom / mnt kullanarak, / mnt içine girip VBoxLinuxAdditions bash komutunu kullanarak bunu mount'a monte edebilirsiniz. Gcc, çekirdek veya diğer bağımlılıkların kurulumunu gerektirebilir.
Andrew Wolfe

mount.vboxsf: montaj hata ile başarısız oldu: Böyle bir dosya veya dizin yok mount: / boot2dockerfolder üzerine mymapfoldername bağlanma başarısız: Böyle bir dosya veya dizin yok
vee

71

cli'dan -v seçeneğini kullanabilirsiniz, bu özellik Dockerfile aracılığıyla kullanılamaz

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

burada host_dir, bağlamak istediğiniz ana bilgisayardan gelen dizindir. yoksa, konteyner dizini hakkında endişelenmenize gerek kalmaz.

Anasistem makinesinden host_dir dosyasında herhangi bir değişiklik yaparsanız (kök ayrıcalığı altında) kapsayıcı tarafından görülebilir ve tersi de geçerlidir.


6
Ana bilgisayar montaj seçeneğini göstermek için ne güzel, temiz, noktaya bir örnek. Belki gerçek dizin kullanılarak geliştirilebilir: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashburada ana bilgisayar /tmpkonteynere monte edilecektir /tmp. Şimdi touch /tmp/hello-worldkonteynerden biri olabilir ve dosyayı ana bilgisayarda görünür.
Stephan Henningsen

3
Mükemmel çalışıyor. Ancak bu şekilde bağlanırsa dizin sahibi kök olarak ayarlanır ve bu da kabın kök olarak çalışmasını bekler. Kap kök olmayan olarak çalıştırıldığında, dizini kök olmayan olarak nasıl bağlarız?
Arun

33

OS X'de docker'ı boot2dockerveya benzeri bir şey kullanmanız mümkün mü ?

Ben aynı deneyimi yaptım - komut doğru ama zaten hiçbir şey (mantıklı) konteyner monte.

Anlaşıldığı üzere - docker belgelerinde zaten açıklanmıştır . Ne zaman yazın docker run -v /var/logs/on/host:/var/logs/in/container ...ardından /var/logs/on/hostgerçekte dan eşleştirilmiş boot2dockerVM görüntü değil, Mac.

Paylaşılan klasörü VM'niz aracılığıyla gerçek ana makinenize (benim durumumdaki Mac) yönlendirmeniz gerekir.


1
Teşekkürler! Bu uzaktan ilgili bir sorunla bana yardımcı oldu. Docker'ın içinde çalışan postgres, OS X'de çalışmadığı gibi yerel ana bilgisayara değil VBox
IP'sine bağlıydı

2
Liman işçisi belgelerine ilişkin URL artık geçerli değil
digitaldavenyc

haha şimdiye kadarki en iyi şaka .. gerçekten bir ipucu yapabilirdi.
user2834172

2
Doküman bağlantınız 404
Factor Mystic

3
Paylaşılan klasörü VM aracılığıyla gerçek ana bilgisayara borulama örneği görmeyi merak ediyorum.
Derek

28

[GÜNCELLEME] ~ Haziran 2017 itibarıyla, Docker for Mac , VirtualBox ile uğraşmak zorunda olduğunuz tüm sinir bozucu bölümleri halleder. Temel olarak yerel ana makinenizdeki her şeyi /privateöneki kullanarak eşlemenizi sağlar . Daha fazla bilgi burada . [/GÜNCELLEME]

Mevcut tüm cevaplar Boot2docker hakkında konuşuyor. Bu artık liman işçisi makine lehine kullanımdan kaldırıldığı için liman işçisi makine için çalışır:

İlk olarak, docker-machine vm'ye gidin ve eşleştireceğimiz klasörü oluşturun:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

Şimdi klasörü VirtualBox ile paylaşın:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Son olarak, dock makinesine tekrar ssh atın ve paylaştığımız klasörü bağlayın:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Not: UID ve GID için, daha önce alınmadıkları sürece, tamsayıları kullanabilirsiniz.

Bu, OS X El Capitan'daki liman işçisi makine 0.4.1 ve liman işçisi 1.8.3'ten itibaren test edilmiştir.


1
+1. Birkaç saat başıma vurduktan sonra cevabınız işe yaradı. Bu docker-machinedokümanın bir parçası olmalı .
Abhijit Sarkar

Neden -vbayrağı kullanmıyorsunuz ?
igracia

1
@ igracia, -vbayrak OS X'te (veya pencerelerde) beklediğiniz gibi çalışmaz. Docker bir VM'de çalışır, böylece başvurulan -vklasör kök işletim sisteminde değil, VM'deki bir klasöre işaret eder. Bu teknik, VM klasörünü kök işletim sistemiyle yeniden eşleştirmenin bir sonraki adımını alır.
Patrick Gunderson

1
@PatrickGunderson Benim durumumda (OS X) klasör ana makinede, VM'de değil ve iyi çalışıyor. Docker Tolls, sanal makineye ve oradan konteynere aktarmaya özen gösterir.
igracia

1
Bahsettiğim kuralın tek istisnası, VM'nin /Usersdocker ile paylaşmak için otomatik olarak bağlanacağıdır . Bu, çalışma dosyalarınız ~/*içerideyse, gitmek için iyi olduğunuz anlamına gelir . Eğer dev ortamı tükenmeye ayarlarınız varsa /developmentveya başka bir şey /Usersalmada sorun gerekecek docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson'un

27

Fiziksel makinemi temiz tutmak için SailsJS uygulamamın Docker konteynerinde çalışmasını deniyorum.

/ App altında SailsJS / NodeJS uygulamamı bağlamak için aşağıdaki komutu kullanıyorum:

cd my_source_code_folder
docker run -it -p 1337: 1337 -v $ (pwd): / uygulama my_docker / image_with_nodejs_etc

5
Dockerfile'da bunu nasıl yapabilirim?
orad

23
docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

Sistemimde nhjk'in cevabını düzelttim, -tbayrağı eklediğinizde kusursuz çalışıyor .


Yerel FS'den dosya oluşturabilir / güncelleyebilir ve docker kapsayıcısındaki değişiklikleri görebilir misiniz?
Avi Mehenwal

14

Ana bilgisayar Windows 10 ise, eğik çizgi yerine ters eğik çizgi kullanın -

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

Ana bilgisayar sürücüsünün paylaşıldığından emin olun (bu durumda C). Benim durumumda yukarıdaki komutu çalıştırdıktan sonra paylaşım izni isteyen bir komut istemi aldım.


13

Mac OS'de, /Users/<name>/projects/mac'unuza kapsayıcınızın kökündeki bir klasörü bağlamak için :

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects


11

Temmuz 2015 güncellemesi - boot2docker artık doğrudan montajı destekliyor. -v /var/logs/on/host:/var/logs/in/containerÇift montaj olmadan doğrudan Mac isteminizden kullanabilirsiniz


11

For Windows 10 kullanıcıları, içinde bağlama noktası olması önemlidir C:/Users/dizine. Bunun işe yaraması için saatlerce denedim. Bu yazı yardımcı oldu, ancak Windows 10'un çözümü kabul edilen bir cevaba yorum olduğu için ilk başta belli değildi. Ben böyle yaptım:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

Daha sonra test etmek echo TEST > hostTest.txtiçin görüntünüzün içinde yapabilirsiniz . Bu yeni dosyayı adresindeki yerel ana bilgisayar klasöründe görebilmeniz gerekir C:/Users/C/Desktop/dockerStorage/.


Yoldaki çift eğik çizgiler benim için işe yaradı. Kafa karıştırıcıydı çünkü -v $(pwd):/var/xxilk kullandım ve bu işe yaradı, ancak boş bir dizine neden oldu. Babun üzerinden cyg kullanıyorum.
kenchilada

/ C / data / kullanırken Windows 7'de aynı sorunu yaşadım, / c / Users / <user> / altında ana makine dizinini taşıyıp benim için çözdüm. Teşekkürler.
user8675309

1
sorunu çözmenize yardımcı olan yayına bir bağlantı verebilir miyiz?
PBo

11

Aynı sorunu yaşıyorum. Komut satırım şöyle görünüyordu:

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

Sorun 'pwd' ile oldu. Bu yüzden $ (pwd) olarak değiştirdim:

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME

1
Ne ziçin?
hhh

2
Z seçeneği, ciltleme bağlama içeriğinin birden çok kap arasında paylaşıldığını gösterir.
Jason

10

Docker 18-CE'den itibaren, docker run -v /src/path:/container/pathbir ana bilgisayar klasörüne 2 yönlü bağlanma yapmak için kullanabilirsiniz .

Windows 10 / WSL ile çalışıyorsanız ve ana bilgisayarınız olarak Windows için Docker-CE ve ardından WSL'de docker-ce istemci araçları varsa, burada büyük bir sorun var. WSL, tüm / dosya sistemini, Windows ana makineniz ise yalnızca sürücülerinizi bilir. WSL içinde / mnt / c / projectpath komutunu kullanabilirsiniz, ancak denerseniz docker run -v ${PWD}:/projectpath, anasistemde / projectpath / komutunun boş olduğunu göreceksiniz çünkü anasistem / mnt hiçbir şey ifade etmez.

/ C / projectpath öğesinden çalışıyorsanız ve THEN yaparsanız docker run -v ${PWD}:/projectpathve bunu konteynerde bulursanız, / projectpath / c / projectpath öğesini gerçek zamanlı olarak yansıtır. Bu sorunu saptamanın, misafirinizde boş bağlar görmekten başka bir hata veya başka bir yol yoktur.

Ayrıca Docker for Windows ayarlarında da "sürücüyü paylaştığınızdan" emin olmalısınız.


Win10 / WSL ve Docker-CE / docker-ce ile bu sorunu yaşıyorum. Boş / proje yolu. "Work from / c / projectpath" ile ne demek istiyorsun? / C / to / mnt / c'yi bağlamayı denedim ve çalışıyorum /c/projectpathama sonra hatayı alıyorum bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder

Bu bağlantı sorunumu çözdü: support.divio.com/local-development/docker/… (Windows'ta Docker yalnızca / Users / varsayılan olarak montaja izin verir)
Steven T. Snyder

7

Ben gibi sistem yönergesi altında döşeme herhangi bir dizin bulundu /var, /usr, /etckabın altına monte edilememiştir.

Yönerge kullanıcının boşluk -vanahtarında olmalıdır, docker arka plan programına yerel dizini kaba bağlama talimatı verir, örneğin:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}

5

VirtualBox Misafir Eklemeleri ile birlikte boot2docker
/ Boot2docker'a nasıl monte edilir / Kullanıcılar

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr VirtualBox Misafir Eklemeleri ile kendi özel boot2docker.iso'nuzu oluşturun ( bağlantıya bakın ) veya http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso dosyasını indirin ve kaydedin ~ / .boot2docker / boot2docker.iso adresine gidin.


Ben iso kullanarak çalıştı ve ben hala aynı sorunları koştu ... Bu yazı özetlenen talimatları kullanarak olsa da sıralamak için bana yardımcı oldu - temelde paylaşılan klasörü zorlamak zorunda kaldı.
Jaco Pretorius

ISO kullandım, 'VBoxManage sharedfolder add ...' cmd çağırmadan önce Virtual Box VM'yi durdurmadım. Sonunda hepsi çok büyük olsa da çalışma var teşekkürler.
Emile

Not: -v bağımsız değişkeninin boot2docker aracılığıyla çalışmamasının nedeni, görünüşte gerçek ana makinenize değil, boot2docker-vm'ye bağlanmasıyla ilgili bir şeydir. bu yüzden sanırım Vboxmanage kısmı işe yarıyor.
Emile

5

Main_folder'ı docker kapsayıcısında bulunan test_container klasörüne nasıl bağlarım?

Boot2docker kullanan bir Mac'inizde (gelecekteki güncellemelere bağlı olarak) bu durumda klasörü boş bulabileceğiniz sürece aşağıdaki komutunuz doğrudur. Bunu düzeltmek için bir öğretici için matların cevabına bakınız.

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

Ben gerçekten çalıştırmak -d -v komutunu kullanmadan nasıl, bu otomatik olarak yapmak gerekir.

Bu komutları kullanmaktan gerçekten kurtulamazsınız, bunlar docker'ın çalışma şekline özgüdür. Tekrar tekrar yazmak için onları bir kabuk betiğine koymak en iyi olurdu.

Boot2docker çökerse ne olur? Liman işçisi dosyaları nerede saklanır?

-V bağımsız değişkenini kullanmayı ve ana makinenize başvurmayı başarırsanız, dosyalar ana makinenizde güvende olur.

'Docker build -t myimage' kullandıysanız. Dockerfile ile dosyalarınız görüntüye dönüştürülür.

Docker resimleriniz, sanırım boot2docker-vm'de saklanır. VirtualBox vm sildiğimde görüntüleri kaybolduğunda bunu öğrendim. (Not, ben Virtualbox nasıl çalıştığını bilmiyorum, bu yüzden görüntüleri hala başka bir yerde gizlenmiş olabilir, sadece docker tarafından görülebilir değil).


5

Aynı sorun vardı. Bunu docker belgelerinde buldu :

Not: Ana makine dizini, doğası gereği ana bilgisayara bağlıdır. Bu nedenle, Dockerfile'dan bir ana bilgisayar dizini bağlayamazsınız, VOLUME komutu, yerleşik görüntülerin taşınabilir olması gerektiğinden, bir host-dir iletimini desteklemez. Bir ana bilgisayar dizini tüm potansiyel ana bilgisayarlarda kullanılamaz.

Bu nedenle, diğer cevaplar doğru bir şekilde işaret ettiğinden, bir okuma / yazma ana bilgisayar dizini monte etmek yalnızca komuttaki -vparametre ile mümkündür docker run.


Ana bilgisayar dizini tam olarak nedir?
Nicolas S.Xu

@ NicolasS.Xu Docker ana bilgisayarındaki herhangi bir yol.
J. Scott Elblein

5

Windows yolu ile bir örnek:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

Bir yan not olarak, tüm bu saç çekme, çözme ile güreşmek ve yolları tekrar tekrar yeniden yazmak zorunda kalırken, AutoHotkeybir Windows yolunu "Docker Windows " biçimli yola dönüştürmek için küçük bir komut dosyası kırmaya karar verdim. . Bu şekilde tek yapmam gereken, bağlantı noktası olarak kullanmak istediğim herhangi bir Windows yolunu panoya kopyalamak, klavyedeki "Apps Key" tuşuna basmak ve Docker'ın takdir ettiği bir yol biçiminde biçimlendirmektir.

Örneğin:

Bunu panonuza kopyalayın:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

Apps Keyimleç komut satırında istediğiniz yerde iken tuşuna basın, bunu buraya yapıştırın:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

Benim için çok zaman kazandırıyor. Burada yararlı bulabilecek herkes içindir.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 

4

Windows 10'da bunun çalışmasını sağlamak için sistem tepsisinden Docker Ayarları penceresini açmam ve Paylaşılan Sürücüler bölümüne gitmem gerekiyordu .

Sonra yanındaki kutuyu işaretledim C. Docker, masaüstü bilgisayar bilgilerimden Kullanıcılar klasörüne yazma yetkisi almasını istedi.

Sonra, docker kapsayıcısını yukarıdaki örnekleri izleyerek ve ayrıca o ayarlar sayfasındaki /datakapsayıcıya ekleyerek çalıştırdım .

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options

3

Windows'ta mutlak yol sağlamanız gerektiğini unutmayın.

Aşağıda benim için çalıştı.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash

3

Ben aynı sorunları vardı, ben docker C: \ Users \ klasörünü bağlamaya çalışıyordu
bu nasıl yaptım Docker Toolbox komut satırı

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>

2

Ana bilgisayar dizinini konteynerden bağlama gereksinimim vardı ve birim bağlama komutunu kullandım. Ancak test sırasında, konteyner içinde de dosyalar oluşturduğunu fark ettiler, ancak bazı kazmalardan sonra sadece sembolik bağlantılar olduklarını ve ana dosya sisteminden kullanılan gerçek dosya sistemini buldular.


2

Bunu, farklı bir görsel deneyim için Portainer web uygulamasıyla da yapabilirsiniz .

Önce Portainer görüntüsünü çekin:

docker pull portainer/portainer

Ardından Portainer için bir birim oluşturun:

docker volume create portainer_data

Ayrıca bir Portainer kapsayıcısı oluşturun:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Web uygulamasına tarayıcınızla şu URL'den erişebilirsiniz: " http: // localhost: 9000 ". İlk girişte, Portainer yönetici kimlik bilgilerinizi ayarlamanız istenir.

Web uygulamasında şu menüleri ve düğmeleri izleyin: (Kapsayıcı> Kapsayıcı ekle> Dolgu ayarları > Kapsayıcıyı Dağıt)

Portainer ile bir "bağlama" birimi oluşturmakta sorun yaşadım ve kabımın birimini oluştururken "bağlama" yı tıklatmam gerektiğini fark ettim. Aşağıda, ana bilgisayara bağlı bir birim bağlanmış konteynır oluşturma için çalışan ses bağlama ayarlarının bir gösterimi bulunmaktadır.

hacim ciltleme ayarları

Not: Docker 19.035 ve Portainer 1.23.1 kullanıyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.