Jak powinna wyglądać składnia „woluminów” Docker Compose w wersji 2?

43

W Docker Compose v1.6.0 + dostępna jest teraz nowa składnia pliku / wersja 2 dla tego docker-compose.ymlpliku. Zmiany obejmują oddzielny klucz najwyższego poziomu o nazwie volumes. Umożliwia to „scentralizowanie” definicji woluminów w jednym miejscu.

To, co próbuję zrobić, to nazwać tam woluminy i mieć jedną ścieżkę odniesienia wielu woluminów na moim lokalnym dysku hosta. Poniżej znajduje się przykład zgłaszania wyjątku z Tracebackzakończeniem

AttributeError: 'list' object has no attribute 'items'

Przykład docker-compose.yml:

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

Do tej pory przeczytałem wszystkie odniesienia do konfiguracji Docker Compose docs master-branch Volume, odniesienie do Docker Compose docs Volume / Volume-Driver i przejrzałem przykłady GitHub, aby znaleźć poprawną składnię, która jest oczekiwana. Wygląda na to, że nikt już tego nie używa (GitHub), a dokumentacja jest daleka od ukończenia (docker.com). Próbowałem również zbudować osobny wolumin jako servicei odwołać się do niego volumes, ale to również nie działa. Masz pomysł, jak powinna wyglądać ta składnia?

kajzer
źródło

Odpowiedzi:

40

Cel volumesklucza

Ma na celu tworzenie nazwanych woluminów .

Jeśli go nie użyjesz, znajdziesz mnóstwo wartości mieszanych dla swoich woluminów. Przykład:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Dzięki nazwanym woluminom otrzymujesz coś takiego:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Jak utworzyć nazwane woluminy

docker-compose.ymlSkładnia jest następująca:

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

To coś jak wyżej pokazuje nazwane tomy.

Jak zbiorczo usuwać woluminy

Kiedy masz mnóstwo skrótów, oczyszczenie może być dość trudne. Oto jedna linijka:

docker volume rm $(docker volume ls |awk '{print $2}')

Edycja: Jak zauważył @ArthurTacca w komentarzach, istnieje łatwiejszy do zapamiętania sposób:

docker volume rm $(docker volume ls -q)

Jak uzyskać szczegółowe informacje na temat nazwanego woluminu

Teraz, gdy nie musisz już szukać skrótów, możesz na nie wejść i nazwać je… ich  imieniem:

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

Sidenote: Możesz chcieć, aby docker-compose downTwoje usługi zaczęły od nowa, zanim zaczniesz tworzyć woluminy.

Jeśli używasz Boot2Docker / Docker Machine , musisz to zrobić, docker-machine ssha sudo -iprzed wykonaniem jednego ls -la /mnt/…z tego woluminu - hostem jest maszyna wirtualna udostępniona przez Docker Machine .

kajzer
źródło
1
bardzo dobra odpowiedź. Twoje zdrowie. Dużo się wyjaśniło, gdy wracałem, by znaleźć nowe woluminy skomponowane przez dokerów.
Derek Adair,
Gdzie je znalazłeś? wydaje się o wiele więcej niż dokumenty dokerów?
Derek Adair,
1
@DerekAdair Dzięki, ale jak możesz przeczytać w statystykach w lewym górnym rogu, ta odpowiedź jest dobrze przywoływana na stronach wyników wyszukiwania Google na ten temat.
kaiser
1
Zamiast tego $(docker volume ls |awk '{print $2}')możesz użyć $(docker volume ls -q)Nie tylko jest to prostsze, ale nie drukuje „GŁOŚNOŚCI” w pierwszym wierszu.
Arthur Tacca
2
To nie jest poprawne; to nie robi tego, na co wygląda. volumes_fromjest dziedziczenie listy woluminów z innego kontenera. Aby użyć nazwanego woluminu, użyj składni na poziomie usługi - NAME:DESTi ustaw ścieżkę w volumeskluczu najwyższego poziomu . To, co robi ten przykład (w chwili pisania tego tekstu), tworzy standardowy wolumin oprócz nazwanego woluminu, a nazwany wolumin po prostu nie jest używany.
trevorj
13

W moim rozumieniu możesz użyć volumes:sekcji globalnej do

  • zdefiniuj nazwę woluminu
  • udostępnić nazwany wolumin pod inną nazwą woluminu
  • określ sterownik i opcje sterownika dla nazwanego woluminu

Woluminy w sekcji globalnej będą tworzone automatycznie, chyba że zostanie to określone external: true. Nadal będziesz musiał powiedzieć każdej usłudze w tej volumes:sekcji, gdzie ma zainstalować ten wolumin.

Oto bardzo prosty przykład:

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

volumes:Wpis globalny dla projectspowoduje utworzenie nazwanego woluminu project. Następnie jest montowany jako /barserwisowy i /fooserwisowy. Obie usługi współużytkują dane woluminu i mogą je odczytywać / zapisywać.

Nie sądzę, że to, co próbujesz zrobić, jest możliwe (przekształcenie wielu ścieżek w jeden wolumin i użycie różnych flag r / w). Jeśli jest to możliwe, prawdopodobnie znajdując sposób na utworzenie nazwanego woluminu z tymi właściwościami w inny sposób, a następnie dodanie go jako woluminu zewnętrznego:

volumes:
  mymagicvolume:
    external: true
puzzle
źródło
1
Już głosowałem, ale właśnie dzisiaj znalazłem czas na obejście tego i dodałem rozszerzone dane. Dzięki za wszelką pomoc! Pytanie: Gdy nazywasz wolumin, projecta następnie odwołujesz się do niego project:/bar, gdzie projectfaktycznie zdefiniowano ścieżki?
kaiser
docker-compose automatycznie utworzy je jako nazwane woluminy w / var / lib / docker / volume / volumename
JamesCW
Przepraszamy, nadal nie rozumiem, gdzie doker pobiera ścieżkę do project:aliasu? Skąd doker wie, czy chcę się dzielić, powiedz ./some_folder/some_subfolder/yet_another_subfolderdo kontenerów one:i two:?
Alexander Lomia
W takim przypadku jest to „projekt: <dowolna ścieżka>” pod woluminami najwyższego poziomu: sekcja
Balint Bako
5

Sprawdź na przykład wersję 2 , a także odniesienie do konfiguracji woluminu :

Mój przykład: (wersja 1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 
Alexus
źródło
1
Właśnie to połączyłem w pytaniu i dlatego nie odpowiada na moje pytanie. Czy mógłbyś opublikować przykład mapowania różnych katalogów z hosta jako woluminu nazwanego na wiele usług?
Kaiser
mój link jest inny, wskazuje na Version 2sekcję dokumentu)
Alex
Mój błąd. Po prostu zapomniałem też o tym połączyć. Kiedy spojrzysz na pytania YML zawarte w pytaniu, zobaczysz, że wyraźnie starałem się obejść, używając osobnego volumesklucza najwyższego poziomu - czego nie zrobiłem, stąd pytanie. Nie rozumiem, co docker-compose.ymlma wyjaśniać część składni wersji 1.
Kaiser
5

Myślę, że to, co próbujesz zrobić, jest mniej więcej takie samo, jak tutaj . Krótko mówiąc: obecnie nie jest możliwe utworzenie nazwanego woluminu, który odnosi się do punktu podłączenia na hoście. Możesz utworzyć nazwany wolumin, aby współużytkować dane między kontenerami, ale dane będą istnieć tylko w samym woluminie i znikną po usunięciu woluminu.

Zaproponowano montowanie nazwanych woluminów , ale niestety nie zostanie ono dodane do rdzenia w najbliższej przyszłości. Jest to jednak możliwe przy użyciu wtyczki dokującej o nazwie local-persist .

Szlifierka
źródło
3
Montowanie nazwanych woluminów jest teraz rzeczą … od 1.11 lub 1.12.
kaiser