Zostałem poproszony przez dev ops w firmie, w której pracuję, aby zrobić coś nieco innego z Dockerem, wtedy też jestem używany. Celem jest posiadanie 2 pojemników o następujących obowiązkach:Wymieniony wolumen Docker udostępniający kompilację nie aktualizuje się
Kontener A: Pojemnik węzła, który zbuduje aplikację reagującą na frontend i umieści pakiet w katalogu o nazwie app/dist/
. Po zakończeniu pojemnik przestanie działać.
Kontener B: Pojemnik alpejski nginx, który będzie serwer plików statycznych z /usr/share/nginx/html/app
.
Pliki, które zostały zbudowane w kontenerze A, zostaną dostarczone do kontenera B przy użyciu woluminu, który będzie montował <Container A>/app/dist
na <Container B>/usr/share/nginx/html/app
.
Należy zauważyć, że pomiędzy ogólnodostępnym portem a kontenerem nginx znajduje się warstwa HAProxy, która jest kontenerem o nazwie app
.
Zadania powyżej są zaaranżowane przy użyciu pliku tworzenia, Döcker który wygląda tak:
version: '2'
volumes:
webapp_build_volume: {}
services:
webapp_build:
build:
context: .
dockerfile: 'config/nginx/dockerfile-builder'
volumes:
- webapp_build_volume:/app/dist
- webapp_static_volume:/app/src/app/static
app:
build:
context: 'config/haproxy'
dockerfile: 'dockerfile-app-haproxy'
links:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- '80:80'
- '1936:1936'
web:
build:
context: .
dockerfile: 'config/nginx/dockerfile-web'
environment:
- EXCLUDE_PORTS=443
- VIRTUAL_HOST=*
depends_on:
- webapp_build
volumes:
- webapp_build_volume:/usr/share/nginx/html/app
ten pracuje obecnie tylko za pierwszym razem plik komponować doker jest zbudowany. Pliki w woluminie nie są już aktualizowane po utworzeniu woluminu. Czytałem, że nazwane woluminy nie mogą być aktualizowane po ich utworzeniu, ale nie mogę tego potwierdzić. Znalazłem work arounds, które wymagają uruchomienia docker-compose rm --force && docker volume webapp_build rm
, ale nie chciałbym zabijać kontenerów buforowanych, jeśli to możliwe, ponieważ usługa CI będzie działać zbyt wolno.
Proszę dać mi znać, jeśli mogę coś wyjaśnić (rozumiem, że tutaj jest dużo ruchomych części). Uwaga Używam również wersji beta docker 2, ale nie widzę, jak to mogło zmienić wszystko, co tutaj zrobiłem.
Próba Roztwór 1 obecnie. Wkrótce Cię powiadomię! – Shawn
dziękuję. Twoje pierwsze rozwiązanie działało tam. Dlaczego powoduje to aktualizację woluminu, ale budowanie w katalogu nie było możliwe? – Shawn
Zbudowałeś katalog, ale podczas kompilacji wolumin nie został zamontowany, a dzieje się to po uruchomieniu kontenera. Po zamontowaniu woluminu w uruchomionym kontenerze Docker kopiuje tylko zawartość z obrazu do woluminu, gdy wolumin jest pusty, aw późniejszym czasie ten krok inicjowania woluminu nie jest wykonywany (w przeciwnym razie można by zniszczyć zawartość, gdy próbujesz użyć woluminu w drugim pojemniku). – BMitch