Załóżmy, że mam kontener Dockera i folder na moim hoście /hostFolder
. Teraz, jeśli chcę dodać ten folder do kontenera Docker jako wolumin, mogę to zrobić, używając ADD
go Dockerfile
lub montując go jako wolumin.
Na razie w porządku.
Teraz /hostFolder
zawiera podfolder /hostFolder/subFolder
.
Chcę zamontować /hostFolder
w kontenerze Docker (niezależnie od tego, czy jest to tylko do odczytu, czy do odczytu, nie ma znaczenia, działa dla mnie oba), ale NIE chcę, aby było to uwzględnione /hostFolder/subFolder
. Chcę to wykluczyć, a także chcę, aby kontener Docker mógł dokonywać zmian w tym podfolderze, bez konsekwencji zmiany go również na hoście.
czy to możliwe? Jeśli tak to jak?
docker
dockerfile
Golo Roden
źródło
źródło
Odpowiedzi:
Za pomocą komponentu dokującego jestem w stanie używać modułów node_modules lokalnie, ale zignoruj go w kontenerze dokera, używając następującej składni w
docker-compose.yml
Wszystko
./angularApp
jest odwzorowane na/opt/app
a następnie tworzę kolejny wolumin montowania,/opt/app/node_modules/
który jest teraz pustym katalogiem - nawet jeśli na moim komputerze lokalnym./angularApp/node_modules
nie jest pusty.źródło
/opt/app/node_modules/
innym katalogiem o tej samej nazwie. Wystąpił błąd: „Volume busy”-v $(pwd):/build/ -v /build/node_modules
If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
Jeśli chcesz, aby podkatalogi były ignorowane przez okno dokowane, ale trwałe, możesz wykonać następujące czynności
docker-compose.yml
:Spowoduje to zamontowanie bieżącego katalogu jako woluminu udostępnionego, ale zamontowanie trwałego woluminu dokującego w miejsce
node_modules
katalogu lokalnego . Jest to podobne do odpowiedzi @kernix, ale pozwoli tonode_modules
na zachowanie się między kolejnymidocker-compose up
uruchomieniami, co jest prawdopodobnie pożądanym zachowaniem.źródło
docker-compose down
usunie pojemniki, ale wolumin będzie trwał, dopóki nie uruchomisz czegoś takiegodocker system prune
node_modules:
nazwanego woluminu „ignoruje”/app/node_modules
kontenera w oknie dokowanym, może uznać ten post za użyteczny. W jaki sposób doker obsługuje wiele typów montowania?Aby wykluczyć plik, użyj następujących poleceń
źródło
Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Dodanie ukośnika nie pomogło./dev/null
do kontenera jako plik urządzenia.Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Nie tego dokładnie szukał OP, ale było to dla mnie bardzo przydatne, ponieważ musiałem wykluczyć pojedynczy plik.Po pierwsze, użycie
ADD
instrukcji w Dockerfile różni się bardzo od używania woluminu (albo poprzez-v
argument dodocker run
alboVOLUME
instrukcję w Dockerfile).ADD
ICOPY
polecenia po prostu wziąć kopię plików w czasiedocker build
jest prowadzony. Te pliki nie są aktualizowane, dopóki nie zostanie utworzony nowy obraz za pomocądocker build
polecenia. Natomiast użycie woluminu zasadniczo mówi „ten katalog nie powinien być przechowywany w obrazie kontenera; zamiast tego użyj katalogu na hoście”; za każdym razem, gdy plik w woluminie jest zmieniany, zarówno host, jak i kontener natychmiast go zobaczą.Nie wierzę, że możesz osiągnąć to, co chcesz za pomocą woluminów, musisz przemyśleć strukturę katalogu, jeśli chcesz to zrobić.
Jest to jednak dość łatwe do osiągnięcia przy użyciu
COPY
(co powinno być preferowaneADD
). Możesz użyć.dockerignore
pliku, aby wykluczyć podkatalog, lub możesz zrobićCOPY
wszystkie pliki,RUN rm bla
aby usunąć podkatalog.Pamiętaj, że wszelkie pliki dodawane do obrazu za pomocą
COPY
lubADD
muszą znajdować się w kontekście kompilacji, tj. W katalogu lub z katalogu, z którego uruchamiaszdocker build
.źródło
.dockerignore
pliku, aby wykluczyć podkatalog (lub nawet katalog). Biorąc pod uwagę, że taki jest cel pliku, jest on dość dziwny.squash
warstw. Jedna to github.com/goldmann/docker-squash, a druga korzystaoc ex dockerbuild
z projektu openshift.Wygląda na to, że stare rozwiązanie już nie działa (przynajmniej dla mnie). Pomogło jednak tworzenie pustego folderu i mapowanie folderu docelowego do niego.
źródło
docker-compose 1.25.0-rc3
składnią pliku v3.Za pomocą wiersza polecenia dokera:
-v
Opcja może być również używany (kredyt do Bogdana Mart ), ale--mount
jest bardziej czytelna i zalecane .źródło
dla osób, które również miały problem z tym, że folder node_modules nadal nadpisywał z twojego systemu lokalnego i na odwrót
To jest rozwiązanie, z końcową
/
poprawką po module_węzła.źródło
Aby wykluczyć podłączony plik znajdujący się w woluminie komputera, musisz go zastąpić, przydzielając wolumin do tego samego pliku. W twoim pliku konfiguracyjnym:
Przykład w twoim pliku dokera:
źródło