Używam docker-compose i v3. Próbuję zamontować wolumin w dockerze:
./appdata:/appdata
Chciałbym mieć to jako objętość, a następnie odwoływać się do tej objętości z wielu pojemników. Referencyjna konfiguracja objętość tylko pokazuje data-volume:
jak nazwanego objętości, bez wartości, więc nie wyglądają jak wyżej.
services:
nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes:
- app-volume
php:
build: ./php/
expose:
- 9000
volumes:
- app-volume
volumes:
app-volume: ./appdata:/appdata
To daje mi:
BŁĄD: W pliku „./docker-compose.yml” wolumin „app-volume” musi być mapowaniem, a nie ciągiem.
Oczywiście wiem, że muszę zmienić volumes
parę klucz / wartość, ale nie jestem pewien, jak to zmienić, aby móc dzielić wolumen między usługami.
Sprawdziłem również, volumes_from
ale to skutecznie pozwala tylko na dziedziczenie z innych kontenerów. Widziałem, jak ktoś używa volumes_from
innego kontenera, który zawiera żądane mapowanie, ale zcommand: true
ustawieniem, aby kontener nigdy nie był faktycznie uruchamiany, co dla mnie wydaje się po prostu włamaniem.
Jak mogę to zrobić?
Uwaga, to nie mają następującą pracę:
nginx:
volumes:
- ./appdata:/appdata
php:
volumes:
- ./appdata:/appdata
Ale to tylko powielanie i mam nadzieję, że nazwany tom mógłby mi pomóc uniknąć :-)
źródło
Odpowiedzi:
Nazwane woluminy można udostępniać w kontenerach w następujący sposób:
services: nginx: build: ./nginx/ ports: - 80:80 links: - php volumes: - app-volume:location_in_the_container php: build: ./php/ expose: - 9000 volumes: - app-volume:location_in_the_container volumes: app-volume:
Oto przykładowa konfiguracja, której używam do lepszego zrozumienia. Wystawiam pliki statyczne wygenerowane z mojego
web
kontenera do nazwanego woluminu,static-content
który jest następnie odczytywany i obsługiwany przeznginx
kontener:services: nginx: container_name: nginx build: ./nginx/ volumes: - static-content:/usr/src/app web: container_name: web env_file: .env volumes: - static-content:/usr/src/app/public environment: - NODE_ENV=production command: npm run package volumes: static-content:
źródło
static_content
systemie plików hosta?app-volume: location_in_the_container
są błędne./usr/src/app
wnginx
kontenerze i/usr/src/app/public
wweb
kontenerze obie otrzymają oryginalną zawartość, która zostanie wykorzystana i dlaczego?collectstatic
w jednym kontenerze i chcesz, aby wyniki były dostępne w innym, ale nie obchodzi Cię folder hostaTo rozwiązuje problem bez używania nazwanych woluminów:
volumes: - ./appdata:/appdata
Wygląda więc na to:
services: nginx: build: ./nginx/ ports: - 80:80 links: - php volumes: - ./appdata:/appdata php: build: ./php/ expose: - 9000 volumes: - ./appdata:/appdata
źródło
./appdata
, to jest to, co próbuję zrobić. Zostaw tę odpowiedź tutaj :) +1Docker o nazwie woluminy zostały usunięte począwszy od wersji docker-compose 3.
Możesz jednak użyć pól rozszerzeń, aby uniknąć powielania źródła woluminów i zapobiec przyszłym literówkom:
version: '3.5' x-services-volume: &services-volume type: bind source: ./appdata target: /appdata services: nginx: build: ./nginx/ ports: - 80:80 links: - php volumes: *services-volume php: build: ./php/ expose: - 9000 # Use same way as for nginx if target override not needed. volumes: - <<: *services-volume target: /opt/target-override
UWAGA: Ta funkcja jest dostępna od wersji 3.4.
źródło
volumes
, nadal wydają się być czymś w wersji 3 programudocker-compose
.