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:
- Jak muszę połączyć główny_folder z folderem test_container znajdującym się w kontenerze dokera?
- Muszę to zrobić automatycznie. Jak to zrobić bez użycia
run -d -v
polecenia? - Co się stanie, jeśli boot2docker ulegnie awarii? Gdzie są przechowywane pliki Dockera (oprócz Dockerfile)?
docker
mount
boot2docker
Kishore Vaishnav
źródło
źródło
Odpowiedzi:
Można to zrobić na kilka sposobów. Najprostszym sposobem na to jest użycie
ADD
polecenia dockerfile w następujący sposób: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
.tar
i 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ć
-v
flagi podczas korzystania z okna dokowanego:źródło
ADD
tak naprawdę nie „montuje”, kopiuje plik do kontenera, utrwalając go w środku.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 ,
mount
zamiast 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.--mount
Składnia jest bardziej gadatliwy niż-v
albo--volume
, ale kolejność kluczy nie jest znacząca, a wartość flagi jest łatwiejszy do zrozumienia.type
Z uchwytu, który może byćbind
,volume
albotmpfs
. (Będziemy używać binda )The
source
of the mount. W przypadku montowania powiązań jest to ścieżka do pliku lub katalogu na hoście demona Docker. Można określić jakosource
lubsrc
.Jako
destination
wartość przyjmuje ścieżkę, w której plik lub katalog zostanie zamontowany w kontenerze. Może być określona jakodestination
,dst
lubtarget
.Tak więc, aby zamontować bieżący katalog (źródło) za pomocą
/test_container
(docelowego), użyjemy:Jeśli te parametry montowania mają spacje, musisz umieścić wokół nich cudzysłowy. Gdy wiem, że nie, użyłbym
`pwd`
zamiast tego:Będziesz także musiał poradzić sobie z uprawnieniami do plików, zobacz ten artykuł .
źródło
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ń:
1) Zamontuj system lokalny na
boot2docker
2) Zamontuj
boot2docker
plik na kontenerze LinuxNastępnie, gdy będziesz w
ls
środkucontainerfolder
, zobaczysz zawartość swojegohostfolder
.źródło
net share
poleceniem 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.mount: unknown filesystem type 'vboxsf'
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.
źródło
docker run -t -i -v /tmp:/tmp ubuntu /bin/bash
gdzie host/tmp
zostanie zamontowany na kontenerze/tmp
. Teraz możnatouch /tmp/hello-world
z kontenera i zobaczyć, jak plik pojawia się na hoście.Czy to możliwe, że używasz dokera w OS X przez
boot2docker
lub 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/host
rzeczywiście jest odwzorowany zboot2docker
VM-obrazu, a nie komputera Mac.Będziesz musiał przesłać folder współdzielony przez maszynę wirtualną do faktycznego hosta (w moim przypadku Mac).
źródło
[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
/private
prefiksu. 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ć:
Teraz udostępnij folder VirtualBox:
Na koniec ponownie ssh do maszyny dokującej i zamontuj folder, który właśnie udostępniliśmy:
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.
źródło
docker-machine
dokumentu.-v
flagi?-v
flaga 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-v
wskazuje 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./Users
celu 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/development
lub coś innego niż/Users
będziesz miał problemy, docs.docker.com/engine/userguide/containers/dockervolumesWł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:
źródło
W moim systemie poprawiłem odpowiedź od nhjk, działa bezbłędnie po dodaniu
-t
flagi.źródło
Jeśli hostem jest system Windows 10, zamiast ukośnika użyj ukośnika wstecz -
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.
źródło
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
źródło
Aktualizacja z lipca 2015 r. - boot2docker obsługuje teraz bezpośredni montaż. Możesz używać
-v /var/logs/on/host:/var/logs/in/container
bezpośrednio z ekranu komputera Mac, bez podwójnego montażuźródło
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:Następnie, aby to przetestować, możesz zrobić to
echo TEST > hostTest.txt
wewnątrz swojego obrazu. Powinieneś być w stanie zobaczyć ten nowy plik w lokalnym folderze hosta naC:/Users/C/Desktop/dockerStorage/
.źródło
-v $(pwd):/var/xx
pierwszego i to działało, ale spowodowało pusty katalog. Prowadzę cyga przez babun.Mam ten sam problem. Mój wiersz poleceń wyglądał tak:
Problem dotyczył „pwd”. Więc zmieniłem to na $ (pwd):
źródło
z
?Począwszy od Docker 18-CE, można używać
docker run -v /src/path:/container/path
do 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}:/projectpath
a 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.
źródło
/c/projectpath
ale wtedy pojawia się błądbind mount source path does not exist: /host_mnt/c/projectpath
.Uważam, że każdy katalog r mocy dyrektywy systemowej jak
/var
,/usr
,/etc
nie można było zamontować w kontenerze.Dyrektywa powinna dotyczyć
-v
przełącznika spacji użytkownika instruującego demona dokera, aby zamontował katalog lokalny w kontenerze, na przykład:źródło
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
źródło
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.
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).
źródło
Miałem ten sam problem. Znalazłem to w dokumentacji dokera :
Tak więc zamontowanie katalogu hosta do odczytu / zapisu jest możliwe tylko z
-v
parametrem wdocker run
poleceniu, ponieważ inne odpowiedzi wskazują poprawnie.źródło
Oto przykład ze ścieżką systemu Windows:
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
AutoHotkey
skrypt, aby przekonwertować ścieżkę systemu Windows na ścieżkę sformatowaną w systemie „ Docker 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 Key
podczas 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.
źródło
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
/data
w kontenerze.źródło
Pamiętaj, że w systemie Windows musisz podać bezwzględną ścieżkę.
Poniżej działało dla mnie.
źródło
miałem takie same problemy, próbowałem zamontować folder C: \ Users \ w oknie
dokowanym tak to zrobiłem wiersz polecenia Docker Toolbox
źródło
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.
źródło
Możesz to również zrobić za pomocą aplikacji internetowej Portainer , aby uzyskać inne wrażenia wizualne.
Najpierw pociągnij obraz Portainer:
Następnie utwórz wolumin dla Portainer:
Utwórz również kontener 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.
PS: Używam Docker 19.035 i Portainer 1.23.1
źródło