Jak zamontować katalog hosta w kontenerze Docker

618

Próbuję zamontować katalog hosta w kontenerze Docker, aby wszelkie aktualizacje wykonane na hoście były odzwierciedlone w kontenerach Docker.

Gdzie robię coś złego? Oto co zrobiłem:

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

  • Nie wiem jak sprawdzić wersję boot2docker

Pytania i problemy:

  1. Jak muszę połączyć główny_folder z folderem test_container znajdującym się w kontenerze dokera?
  2. Muszę to zrobić automatycznie. Jak to zrobić bez użycia run -d -vpolecenia?
  3. Co się stanie, jeśli boot2docker ulegnie awarii? Gdzie są przechowywane pliki Dockera (oprócz Dockerfile)?
Kishore Vaishnav
źródło
2
Do Twojej wiadomości, wydaje się to naprawione w oknie dokowanym od tego komentarza. Używam boot2docker na moim komputerze Mac. Mogę użyć opcji -v, a mój katalog lokalny zostaje całkowicie podłączony do kontenera.
Marco

Odpowiedzi:

508

Można to zrobić na kilka sposobów. Najprostszym sposobem na to jest użycie ADDpolecenia dockerfile w następujący sposób:

ADD . /path/inside/docker/container

Jednak wszelkie zmiany dokonane w tym katalogu na hoście po skompilowaniu pliku docker nie pojawią się w kontenerze. Wynika to z faktu, że podczas budowania kontenera doker kompresuje katalog do .tari przesyła ten kontekst do kontenera na stałe.

Drugim sposobem na to jest sposób, w jaki próbowałeś, czyli zamontowanie woluminu. Ze względu na możliwie największą przenośność nie można zmapować katalogu hosta do katalogu kontenera dokerów w pliku docker, ponieważ katalog hosta może się zmieniać w zależności od komputera, na którym jest uruchomiony. Aby zamapować katalog hosta na katalog kontenera dokerów, należy użyć -vflagi podczas korzystania z okna dokowanego:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run
nhjk
źródło
Próbowałem jak ten Kishore $ docker -v / Users / kishore / main_folder: / test_container Docker wersja 0.9.1, build 867b2a9 kishore $ docker run -v / Users / kishore / main_folder: / test_container Zastosowanie: docker run [OPCJE] OBRAZ [ POLECENIE] [ARG ...] Uruchom polecenie w nowym kontenerze -P, --publish-all = false: Opublikuj wszystkie odsłonięte porty na interfejsach hosta -a, --attach = []: Dołącz do stdin, stdout lub stderr. -c, --cpu-share = 0: Udziały procesora (waga względna)
Kishore Vaishnav
2
czy możesz mieć oba ADD. i -v podłączenie woluminu w tym samym czasie. używasz domyślnego katalogu katalog_aplikacji, jeśli nie określisz montowania hosta?
alexzg
@alexzg Nie sądzę, że możemy mieć pierwszeństwo tylko pierwszego. Poza tym nie jestem pewien co do domyślnego drugiego katalogu app_dir ... host mount ..?
Kishore Vaishnav
35
To działało dla mnie na Mac OS X z docker-machine i VirtualBox. Jednym z zastrzeżeń, które odkryłem metodą prób i błędów, jest to, że katalog hosta musi być pełną ścieżką, a nie ścieżką względną.
jbustamovej
25
ADDtak naprawdę nie „montuje”, kopiuje plik do kontenera, utrwalając go w środku.
kev
200

Użytkownik tego pytania używał Docker version 0.9.1, build 867b2a9, dam ci odpowiedź dla wersji dokera> = 17.06.

Co chcesz, aby katalog lokalny był zsynchronizowany w katalogu kontenera, można to zrobić, podłączając wolumin z typem bind. Powiąże to katalog źródłowy (system) i docelowy (w kontenerze dokera). To prawie to samo, co montowanie katalogu na Linuksie.

Zgodnie z dokumentacją Dockera , mountzamiast polecenia jest teraz odpowiednie polecenie do zamontowania -v. Oto jego dokumentacja:

  • --mount: Składa się z wielu par klucz-wartość, oddzielonych przecinkami. Każda para klucz / wartość ma postać <key>=<value>krotki. --mountSkładnia jest bardziej gadatliwy niż -valbo --volume, ale kolejność kluczy nie jest znacząca, a wartość flagi jest łatwiejszy do zrozumienia.

  • typeZ uchwytu, który może być bind, volumealbo tmpfs. (Będziemy używać binda )

  • The sourceof the mount. W przypadku montowania powiązań jest to ścieżka do pliku lub katalogu na hoście demona Docker. Można określić jako sourcelub src.

  • Jako destinationwartość przyjmuje ścieżkę, w której plik lub katalog zostanie zamontowany w kontenerze. Może być określona jako destination, dstlub target.

Tak więc, aby zamontować bieżący katalog (źródło) za pomocą /test_container(docelowego), użyjemy:

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

Jeśli te parametry montowania mają spacje, musisz umieścić wokół nich cudzysłowy. Gdy wiem, że nie, użyłbym `pwd`zamiast tego:

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

Będziesz także musiał poradzić sobie z uprawnieniami do plików, zobacz ten artykuł .

Eduardo Santana
źródło
2
Poparłem twoją odpowiedź, ponieważ uwielbiam jej zwięzłość i nie jest ona zła, ale możesz chcieć ją trochę zaktualizować w świetle mojej odpowiedzi na stackoverflow.com/a/51829247/901899
rainabba,
2
Wydaje mi się, że dokumentacja została zaktualizowana od czasu tej odpowiedzi, ponieważ w tej chwili wydaje się zalecać woluminy, a nie monitory. Warto się nad tym zastanowić, zanim cokolwiek zaangażujesz.
Sipty
1
@Sipty może odnosić się do: „ Jeśli opracowujesz nowe aplikacje Docker, rozważ użycie nazwanych woluminów . Nie możesz używać poleceń CLI Docker do bezpośredniego zarządzania
podłączeniami powiązań
81

2 kolejne montowania: Wydaje mi się, że wiele postów może używać dwóch boot2docker, dlatego nic nie widzisz, ponieważ instalujesz katalog z boot2docker, a nie z twojego hosta.

Zasadniczo potrzebujesz 2 kolejnych mocowań:

pierwszy, który zamontuje katalog z twojego hosta do twojego systemu

drugi, aby zamontować nowy katalog z boot2docker do twojego kontenera w następujący sposób:

  • 1) Zamontuj system lokalny na boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Zamontuj boot2dockerplik na kontenerze Linux

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

Następnie, gdy będziesz w lsśrodku containerfolder, zobaczysz zawartość swojego hostfolder.

Louis V.
źródło
1
Najlepsza odpowiedź. Muszę dodać, że (pod Windows) folder hosta w poleceniu mount odnosi się do nazwy udziału folderu. Ten, który pojawia się z net sharepoleceniem w terminalu Windows (cmd). Musisz dodać ten folder jako folder współdzielony z GUI virtualBox (używając tej samej nazwy, jeśli będziesz postępować zgodnie z moją logiką). Jeśli go nie udostępnisz, będzie działać, ale napotkasz problemy z uprawnieniami i odświeżeniami.
Kir Kanos
skąd polecenie mount zna host, na którym znajduje się katalog / boot2dockerfolder?
alfonsodev
mount: unknown filesystem type 'vboxsf'
Wystąpił
„vboxsf” to sterownik „systemu plików” folderów współdzielonych VirtualBox. Należy go skonfigurować w maszynie wirtualnej, instalując rozszerzenia VirtualBox. Obraz boot2docker nie może mieć tych zainstalowanych. VirtualBox ma funkcję „urządzenia” do „wstawiania” obrazów ISO VirtualBox Additions jako wolumin wirtualny. Zazwyczaj można to zamontować na mount, używając mount / dev / cdrom / mnt, wchodząc do / mnt i uruchamiając bash VBoxLinuxAdditions. Może wymagać instalacji gcc, jądra lub innych zależności.
Andrew Wolfe,
mount.vboxsf: podłączenie nie powiodło się z błędem: brak takiego pliku lub katalogu zamontowanie: zamontowanie nazwa pliku mymapfoldern na / boot2dockerfolder nie powiodło się: brak takiego pliku lub katalogu
vee
71

możesz użyć opcji -v z cli, ta funkcja nie jest dostępna przez Dockerfile

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

gdzie katalog_hosta to katalog z hosta, który chcesz zamontować. nie musisz się martwić o katalog kontenera, jeśli nie istnieje, doker go utworzy.

Jeśli dokonasz jakichkolwiek zmian w katalogu host_dir z komputera hosta (z uprawnieniami roota), będzie on widoczny dla kontenera i odwrotnie.

rgaut
źródło
6
Cóż za miły, czysty i konkretny przykład ilustrujący opcję montowania hosta. Być może można by to poprawić, używając katalogu rzeczywistego: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashgdzie host /tmpzostanie zamontowany na kontenerze /tmp. Teraz można touch /tmp/hello-worldz kontenera i zobaczyć, jak plik pojawia się na hoście.
Stephan Henningsen
3
Działa idealnie. Ale zamontowanie w ten sposób ustawia właściciela katalogu jako root, a to także oczekuje, że kontener będzie działał jako root. W jaki sposób montujemy katalog jako inny niż root, gdy kontener jest uruchamiany jako inny niż root?
Arun
33

Czy to możliwe, że używasz dokera w OS X przez boot2dockerlub coś podobnego.

Zrobiłem to samo doświadczenie - polecenie jest poprawne, ale i tak nic (sensownego) nie jest zamontowane w kontenerze.

Jak się okazuje - zostało to już wyjaśnione w dokumentacji dokera . Po wpisaniu docker run -v /var/logs/on/host:/var/logs/in/container ...wtedy /var/logs/on/hostrzeczywiście jest odwzorowany z boot2dockerVM-obrazu, a nie komputera Mac.

Będziesz musiał przesłać folder współdzielony przez maszynę wirtualną do faktycznego hosta (w moim przypadku Mac).

użytkownik3680997
źródło
1
Dzięki! Pomogło mi to z odległym problemem. Postgres działający w Dockerze związał się z VBox IP, a nie z lokalnym
hostem
2
Ten adres URL do dokumentacji dokera jest już nieważny
digitaldavenyc
haha, najlepszy żart, jaki kiedykolwiek… naprawdę mogliby coś powiedzieć.
user2834172
2
Twój link do dokumentacji to 404
Factor Mystic
3
Ciekawi mnie przykład przesyłania potoku folderu udostępnionego przez maszynę wirtualną do rzeczywistego hosta.
Derek
28

[AKTUALIZACJA] Począwszy od ~ czerwca 2017 r., Docker na Maca zajmuje się wszystkimi irytującymi częściami, w których musisz zadzierać z VirtualBox. Pozwala zmapować w zasadzie wszystko na lokalnym hoście przy użyciu /privateprefiksu. Więcej informacji tutaj . [/AKTUALIZACJA]

Wszystkie aktualne odpowiedzi mówią o Boot2docker. Ponieważ jest to przestarzałe na korzyść maszyny dokującej, działa to w przypadku maszyny dokującej:

Najpierw ssh do maszyny dokującej i utwórz folder, do którego będziemy mapować:

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

Teraz udostępnij folder VirtualBox:

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

Na koniec ponownie ssh do maszyny dokującej i zamontuj folder, który właśnie udostępniliśmy:

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

Uwaga: w przypadku UID i GID można w zasadzie używać dowolnych liczb całkowitych, o ile nie są jeszcze zajęte.

Jest to testowane od dokera-maszyny 0.4.1 i dokera 1.8.3 na OS X El Capitan.

Eli
źródło
1
+1. Po kilku godzinach walenia mnie w głowę twoja odpowiedź zadziałała. To powinno być częścią docker-machinedokumentu.
Abhijit Sarkar
Dlaczego nie użyć -vflagi?
igracia
1
@igracia -vflaga nie działa tak, jak można oczekiwać w systemie OS X (lub Windows). Docker działa na maszynie wirtualnej, więc folder wskazany w -vwskazuje na folder na maszynie wirtualnej, a nie w głównym systemie operacyjnym. Ta technika stanowi kolejny krok mapowania folderu VM z powrotem do głównego systemu operacyjnego.
Patrick Gunderson
1
@PatrickGunderson W moim przypadku (OS X) folder znajduje się na hoście, a nie na maszynie wirtualnej i działa dobrze. Docker Tolls zajmują się eksportowaniem go do maszyny wirtualnej, a stamtąd do kontenera.
igracia
1
Jedynym wyjątkiem od reguły, o której wspomniałem, jest to, że maszyna wirtualna automatycznie zainstaluje się w /Userscelu udostępnienia dokerowi. Oznacza to, że jeśli twoje pliki robocze są w ~/*środku, możesz zacząć. Jeśli masz skonfigurowane środowisko programistyczne, którego zabraknie /developmentlub coś innego niż /Usersbędziesz miał problemy, docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson
27

Właśnie eksperymentuję z uruchomieniem mojej aplikacji SailsJS w kontenerze Docker, aby utrzymać czystość mojej fizycznej maszyny.

Korzystam z następującego polecenia, aby zamontować moją aplikację SailsJS / NodeJS w / app:

cd mój_źródłowy_kod_folderu
docker uruchom -it -p 1337: 1337 -v $ (pwd): / app mój_docker / image_with_nodejs_etc
Sven
źródło
5
Jak to zrobić w Dockerfile?
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

W moim systemie poprawiłem odpowiedź od nhjk, działa bezbłędnie po dodaniu -tflagi.

Ali
źródło
Czy jesteś w stanie utworzyć / zaktualizować pliki z lokalnego FS i zobaczyć zmiany w kontenerze dokera?
Avi Mehenwal,
14

Jeśli hostem jest system Windows 10, zamiast ukośnika użyj ukośnika wstecz -

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

Upewnij się, że dysk hosta jest udostępniony (w tym przypadku C). W moim przypadku dostałem monit o pozwolenie na udział po uruchomieniu powyższego polecenia.

Duke79
źródło
13

W systemie Mac OS, aby zamontować folder /Users/<name>/projects/na komputerze Mac w katalogu głównym kontenera:

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

ls /projects

bormat
źródło
11

Aktualizacja z lipca 2015 r. - boot2docker obsługuje teraz bezpośredni montaż. Możesz używać -v /var/logs/on/host:/var/logs/in/containerbezpośrednio z ekranu komputera Mac, bez podwójnego montażu

Tal
źródło
11

Dla użytkowników systemu Windows 10 ważne jest, aby punkt montowania znajdował się w C:/Users/katalogu. Próbowałem godzinami, żeby to zadziałało. Ten post pomógł, ale na początku nie był oczywisty, ponieważ rozwiązanie dla systemu Windows 10 jest komentarzem do zaakceptowanej odpowiedzi. Oto jak to zrobiłem:

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

Następnie, aby to przetestować, możesz zrobić to echo TEST > hostTest.txtwewnątrz swojego obrazu. Powinieneś być w stanie zobaczyć ten nowy plik w lokalnym folderze hosta na C:/Users/C/Desktop/dockerStorage/.

KF
źródło
Podwójne ukośniki na ścieżce sprawiły, że zadziałało to dla mnie. Było to mylące, ponieważ użyłem -v $(pwd):/var/xxpierwszego i to działało, ale spowodowało pusty katalog. Prowadzę cyga przez babun.
kenchilada
Miałem ten sam problem w Windows 7 podczas korzystania z / c / data /, przeniesienie katalogu hosta do katalogu / c / Users / <user> / rozwiązało go dla mnie. Dzięki.
user8675309
1
czy możemy mieć link do postu, który pomógł ci rozwiązać problem?
PBo
11

Mam ten sam problem. Mój wiersz poleceń wyglądał tak:

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

Problem dotyczył „pwd”. Więc zmieniłem to na $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
NikitQa
źródło
1
Do czego służy z?
hhh
2
Opcja z wskazuje, że zawartość podłączenia powiązania jest współużytkowana przez wiele kontenerów.
Jason
10

Począwszy od Docker 18-CE, można używać docker run -v /src/path:/container/pathdo dwukierunkowego wiązania folderu hosta.

Jest jednak duży haczyk, jeśli pracujesz z Windows 10 / WSL i masz Docker-CE dla Windows jako hosta, a następnie narzędzia klienckie dokera w WSL. WSL wie o całym systemie plików /, podczas gdy twój host Windows wie tylko o twoich dyskach. Wewnątrz WSL możesz użyć / mnt / c / projectpath, ale jeśli spróbujesz docker run -v ${PWD}:/projectpath, zobaczysz na hoście, że / projectpath / jest pusty, ponieważ na hoście / mnt nic nie znaczy.

Jeśli pracujesz z / c / projectpath, a TO zrobisz, docker run -v ${PWD}:/projectpatha znajdziesz to w kontenerze, / projectpath będzie odzwierciedlał / c / projectpath w czasie rzeczywistym. Nie ma żadnych błędów ani żadnych innych sposobów wykrycia tego problemu poza widzeniem pustych wierzchowców wewnątrz gościa.

Musisz także „udostępnić dysk” w ustawieniach Docker for Windows.

rainabba
źródło
Mam ten problem z Win10 / WSL i Docker-CE / docker-ce. Pusta / ścieżka projektu /. Co rozumiesz przez „praca z / c / projectpath”? Próbowałem połączyć / c / z / mnt / c i uruchomić z, /c/projectpathale wtedy pojawia się błąd bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder
Ten link rozwiązać mój problem: support.divio.com/local-development/docker/... (Docker na Windows umożliwia montaż tylko z / Users / domyślnie)
Steven T. Snyder
7

Uważam, że każdy katalog r mocy dyrektywy systemowej jak /var, /usr, /etcnie można było zamontować w kontenerze.

Dyrektywa powinna dotyczyć -vprzełącznika spacji użytkownika instruującego demona dokera, aby zamontował katalog lokalny w kontenerze, na przykład:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}
Mansur Ali
źródło
5

boot2docker wraz z dodatkami gości VirtualBox
Jak zamontować / Users w boot2docker

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

tl; dr Zbuduj swój własny boot2docker.iso z dodatkami gości VirtualBox (patrz link ) lub pobierz http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso i zapisz go do ~ / .boot2docker / boot2docker.iso.

kamienie
źródło
Próbowałem użyć tego ISO i nadal napotykałem te same problemy ... Korzystanie ze wskazówek przedstawionych w tym poście pomogło mi jednak go rozwiązać - w zasadzie musiałem wymusić udostępnienie folderu.
Jaco Pretorius
Użyłem ISO, ale natknąłem się na to, że nie zatrzymałem maszyny wirtualnej Virtual Box przed wywołaniem cmd „foldera współdzielonego VBoxManage add ...”. W końcu wszystko działało, choć tak wielkie dzięki.
Emile
Uwaga: powód, dla którego -v arg nie działa przez boot2docker, najwyraźniej ma coś wspólnego z montowaniem go na boot2docker-vm, a nie na twoim hoście. dlatego chyba część Vboxmanage pomaga jej działać.
Emile
5

Jak połączyć główny_folder z folderem test_container znajdującym się w kontenerze dokera?

Poniższe polecenie jest poprawne, chyba że używasz komputera Mac z programem boot2docker (w zależności od przyszłych aktualizacji), w którym to przypadku folder może być pusty. Zobacz matematyczną odpowiedź na samouczek dotyczący tego.

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

Muszę uruchomić to automatycznie, jak to zrobić bez użycia polecenia run -d -v.

Nie można tak naprawdę uciec od używania tych poleceń, są one nieodłącznie związane ze sposobem działania okna dokowanego. Najlepiej byłoby umieścić je w skrypcie powłoki, aby oszczędzać sobie wielokrotnego pisania.

Co się stanie, jeśli boot2docker ulegnie awarii? Gdzie są przechowywane pliki dokera?

Jeśli uda ci się użyć argumentu -v i odwołać się do komputera-hosta, pliki będą bezpieczne na twoim hoście.

Jeśli użyłeś „docker build -t myimage”. za pomocą pliku Docker, twoje pliki zostaną zapisane w obrazie.

Wydaje mi się, że twoje obrazy dokerów są przechowywane w boot2docker-vm. Dowiedziałem się tego, gdy moje obrazy zniknęły po usunięciu vm z VirtualBox. (Uwaga: nie wiem, jak działa Virtualbox, więc obrazy mogą być nadal ukryte gdzie indziej, po prostu niewidoczne dla dokera).

Emile
źródło
5

Miałem ten sam problem. Znalazłem to w dokumentacji dokera :

Uwaga: Katalog hosta jest z natury zależny od hosta. Z tego powodu nie można zamontować katalogu hosta z Dockerfile, instrukcja VOLUME nie obsługuje przekazywania katalogu hosta, ponieważ wbudowane obrazy powinny być przenośne. Katalog hostów nie byłby dostępny na wszystkich potencjalnych hostach.

Tak więc zamontowanie katalogu hosta do odczytu / zapisu jest możliwe tylko z -vparametrem w docker runpoleceniu, ponieważ inne odpowiedzi wskazują poprawnie.

Macieja
źródło
Czym dokładnie jest katalog hosta?
Nicolas S.Xu,
@ NicolasS.Xu Dowolna ścieżka na rzeczywistym komputerze-hoście dokującym.
J. Scott Elblein
5

Oto przykład ze ścieżką systemu Windows:

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

Na marginesie, podczas całego tego ciągnięcia za włosy, zmagania się z rozpracowywaniem i powtarzania ścieżek w kółko, postanowiłem wymyślić mały AutoHotkeyskrypt, aby przekonwertować ścieżkę systemu Windows na ścieżkę sformatowaną w systemieDocker Windows ” . W ten sposób wszystko, co muszę zrobić, to skopiować do schowka dowolną ścieżkę systemu Windows, której chcę użyć jako punktu montowania, naciśnij klawisz „Apps Key” na klawiaturze i sformatujesz go do formatu ścieżki, który docenia Docker.

Na przykład:

Skopiuj to do schowka:

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

naciśnij, Apps Keypodczas gdy kursor jest tam, gdzie chcesz, w wierszu polecenia, a on wklei to tutaj:

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

Oszczędza mi dużo czasu. Tutaj jest dla każdego, kto może uznać to za przydatne.

; --------------------------------------------------------------------------------------------------------------
;
; 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 
J. Scott Elblein
źródło
4

Aby to działało w systemie Windows 10 musiałem otworzyć okno Ustawienia dokera z zasobnika systemowego i przejść do Udostępnionych dysków .

Następnie zaznaczyłem pole obok C . Docker poprosił o podanie poświadczeń pulpitu w celu uzyskania autoryzacji do zapisu w folderze Użytkownicy.

Następnie uruchomiłem kontener dokera zgodnie z powyższymi przykładami, a także przykładem na tej stronie ustawień, dołączając do /dataw kontenerze.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Adam Smith
źródło
3

Pamiętaj, że w systemie Windows musisz podać bezwzględną ścieżkę.

Poniżej działało dla mnie.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash
Chankey Pathak
źródło
3

miałem takie same problemy, próbowałem zamontować folder C: \ Users \ w oknie
dokowanym tak to zrobiłem wiersz polecenia Docker Toolbox

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
Abhishek DK
źródło
2

Miałem takie same wymagania, aby podłączyć katalog hosta z kontenera i użyłem polecenia montowania woluminu. Ale podczas testów zauważyłem, że tworzy też pliki wewnątrz kontenera, ale po pewnym kopaniu okazało się, że są to tylko dowiązania symboliczne i faktyczny system plików używany z maszyny hosta.

Sunil Chauraha
źródło
2

Możesz to również zrobić za pomocą aplikacji internetowej Portainer , aby uzyskać inne wrażenia wizualne.

Najpierw pociągnij obraz Portainer:

docker pull portainer/portainer

Następnie utwórz wolumin dla Portainer:

docker volume create portainer_data

Utwórz również kontener Portainer:

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

Będziesz mógł uzyskać dostęp do aplikacji internetowej za pomocą przeglądarki pod tym adresem URL: „ http: // localhost: 9000 ”. Przy pierwszym logowaniu pojawi się monit o ustawienie poświadczeń administratora Portainer.

W aplikacji internetowej postępuj zgodnie z tymi menu i przyciskami: (Kontener> Dodaj kontener> Ustawienia napełnienia > Wdróż kontener)

Miałem problem z utworzeniem woluminu „mount” za pomocą Portainera i zdałem sobie sprawę, że musiałem kliknąć „bind” podczas tworzenia woluminu mojego kontenera. Poniżej znajduje się ilustracja ustawień wiązania woluminu, które działały przy tworzeniu mojego kontenera z podłączonym woluminem powiązanym z hostem.

ustawienia wiązania woluminu

PS: Używam Docker 19.035 i Portainer 1.23.1

Michael Fayad
źródło