2017-06-23 53 views
5

Istnieją tutaj podobne pytania (docker-compose volumes_from equivalent with version 3, How to replace volumes_from in docker-composer v3), ale nie sądzę, że odpowiadają na pytanie (a przynajmniej nie rozumiem, jak odpowiedzi rozwiązują problem). Pozwólcie, że spróbuję ponownie zapytać, bardzo konkretnie.Odpowiednik volume_from w Docker Compose v3

mam ten v2 Döcker-compose.yml:

version: '2' 
services: 
    full-tests: 
    volumes: 
     - ..:/opt/project 
     - ../../../ext-libs:/opt/ext-libs 
     - ./third-mapping:/opt/third 

    unit-tests: 
    volumes_from: full-tests 

Chodzi o to, że zbiór tomów jest zdefiniowana raz i mogę łatwo ponownie wykorzystać je przy użyciu volumes_from.

Jak przepisałbyś to w wersji v3?

+0

Kilka wskazówek tutaj: https://github.com/moby/moby/issues/19990 – Borek

+0

proszę napisać swoje rzeczy we właściwy sposób V2, a nie sposobem v1 –

+0

@EugenMayer zaktualizowany. – Borek

Odpowiedz

6

Aby odpowiedzieć na twoje pytanie - jest niemożliwe przy v3 - zobacz sekcję poniżej. v3 nie będzie używane jako następca (również oficjalne oświadczenie dokera), powinno być używane w "przypadkach roju".

Niemniej jednak należy użyć nazwanych woluminów.

Można łączyć je z tomów host-montowania jak ten

docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -o o=bind 

Można uprościć ten pomocą długim składni wprowadzone w 3.2: https://docs.docker.com/compose/compose-file/#long-syntax-2 tak można zdefiniować nazwie głośność + Bind on gospodarza w doker-komponować plik przykład:

services: 
    full-tests: 
    volumes:  
     - type: volume 
     source: ../ 
     target: /opt/project 
     - type: volume 
     source: ../../../ext-libs 
     target: /opt/ext-libs 

lub w skrócie jak miałeś

services: 
    full-tests: 
    volumes:  
     - ../:/opt/project 
     - ../../../ext-libs:/opt/ext-libs 

Czego jednak nie można zrobić, umieszczając długą składnię pod definicją "woluminów" najwyższego poziomu, nadając temu woluminowi nazwę i używając go ponownie w sekcji woluminów w usługach - to nie jest możliwe. Aby to zrobić, należy użyć

volumes: 
    project: 
    external: true 
    third-party: 
    external: true 

a następnie za pomocą „objętość doker tworzyć” składni na CLI do stworzenia tych woluminów z opcją wiązania, jak przedstawiono powyżej

ale nigdy nie dostanie tego, co volumes_from robił dla ciebie tutaj


nie ma odpowiednik volumes_from w v3, ponieważ v3 nie jest następcą v2, jej alternatywa - proszę zobaczyć mój komentarz i źródła tutaj https://github.com/rancher/rancher/issues/3316#issuecomment-310889283

Podsumowując - volume_from i volume mają pokrycie w przypadku, gdy volume_from został właśnie użyty w niewłaściwy sposób/w niewłaściwym polu.

a) Jeśli chcesz, aby dane być utrwalone całej uaktualnień stosu (w dół + w górę), wybrać nazwane woluminów - i teraz, jeśli 2+ usługi musi podzielić się tym, po prostu zamontować tej nazwie głośności za pomocą volumes:.

b) Jeżeli jednak zrobić nie chcą dane utrzymują się na rozbudowę stosu (np z powodu jego kod źródłowy i obraz rzeczywistości obejmuje to uaktualnień) jako w zwykłym stosowaniu + httpd/scenariusz proxy, ty utworzy w tym przypadku wolumin-objętość /var/www w pliku Dockerfile przy użyciu Volume /var/www, a następnie użyj volume_from, aby go zamontować w usłudze httpd.


głównym punktem z b jest, że na rozbudowę stosu, objętość anon zostanie usunięty (`doker-komponować dół usuwa pojemniki Anon, ale nie nazwany z nich), a więc upgrade działa zgodnie z oczekiwaniami, trzeba nowy codebase

Próbuje zrobić to samo z wymienionych tomach daje ogromne zaskoczenie na pierwszej aktualizacji, ponieważ kod jest na nazwie objętości i że będzie nakładka kodzie na „świeżym” image/nowy kontener, w ten sposób uruchomisz starą bazę kodów po aktualizacji.

+0

Dzięki, najlepsza odpowiedź do tej pory. Tak więc przy długiej składni, myślę, że jest całkiem możliwe, aby zbliżyć się do mojego przykładu v2 z woluminami nazw z mapowaniem 'device'? Nadal będzie duplikacja między moimi dwoma usługami, ale być może jest powód, dla którego v3 wymusza na mnie to duplikowanie, nie jestem pewien. – Borek

+0

tak, nie sposób obejść tego ograniczenia, zobacz także mój komentarz tutaj https://github.com/docker/compose/issues/4693#issuecomment-310892561 ... ale uważam twój usecase za jedną z nadużyć chciałem zostać zatrzymany (i uważam, że to słuszne) - żadnych ostrych uczuć. I tak jest powód, kiedy myślisz o rozprzestrzenianiu rzeczy w roju, host-mounty są mniej więcej blokerem do tego - jego jedynym dostępnym na jednym hoście, nie wszystkie :) –

+0

Oczywiście, moim przypadkiem użycia jest dokedykowane środowisko programistyczne , a nie skalowalny czas uruchamiania. Tak więc będę miał wiele podobnych "usług" (jednorazowych biegaczy testów w praktyce) i do każdego z nich muszę zmapować kilka lokalnych folderów. (Mapowanie hosta jest ważne dla debugowania.) Prawdopodobnie nie jest to główny przypadek użycia dla funkcji dokowania, ale v2 dobrze to obsługuje. Pozostanę wtedy z tą wersją, mam nadzieję, że nie jest ona przestarzała lub coś, co jest po prostu inne (v3 nie jest następcą, ale alternatywą). – Borek

-1

Dostałem wersję 3 do doku, pracującą z połączeniem. Zasadniczo konieczne było zastąpienie "volume_from" i utworzenie globalnej deklaracji "woluminów".

version: "3" 
services: 
    unison: 
    container_name: xxx_unison 
    image: onnimonni/unison 
    environment: 
     - UNISON_DIR=/var/www/$DOCKER_WEB_DOMAIN/htdocs/ 
     - UNISON_USER=www-data 
     - UNISON_UID=1000 
     - UNISON_GID=1001  
    volumes: 
     - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/ 
    networks: 
     - frontend  
    ports: 
     - "5000:5000"  
    database: 
    container_name: xxx_database 
    image: percona 
    depends_on: 
     - unison 
    environment: 
     - MYSQL_ROOT_PASSWORD=xxx 
     - MYSQL_DATABASE=xxx # Assign a database to be created on container first load 
    volumes: 
     - ./mysql/import:/docker-entrypoint-initdb.d 
     - ./mysql/data/:/var/lib/mysql/ 
     - ./logs:/var/log/mysql 
     - ./mysql/conf:/etc/mysql/conf.d   
    ports: 
     - "3306:3306" 
    networks: 
     - frontend 
    web: 
    container_name: xxx_web 
    image: ubuntu 
    depends_on: 
     - unison  
    volumes: 
     - ./nginx/ssl/:/etc/nginx/ssl/ 
     - ./logs/:/var/log/nginx 
     - ./shell/run.sh:/run.sh 
     - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/ 
    ports: 
     - "80:80" 
     - "443:443" 
    networks: 
     - frontend 
    env_file: 
     - ./.env  
networks: 
    frontend: 
volumes: 
    unison_file: