Wie soll die Syntax von Docker Compose Version 2 "Volumes" aussehen?

Mit Docker Compose v1.6.0+ gibt es jetzt eine neue / version 2-Dateisyntax für die docker-compose.yml Datei. Die Änderungen umfassen einen separaten Schlüssel der obersten Ebene mit dem Namen volumes. Dies ermöglicht es, Volumendefinitionen an einem Ort zu "zentralisieren".

Was ich versuche zu tun ist Name volumes drin und haben einen einzelnen Volume-Referenzpfad für mehrere Pfade auf meiner lokalen Host-Festplatte. Das Folgende ist ein Beispiel, das eine Ausnahme mit a auslöst Traceback das endet mit

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

Beispiel 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/sharemevolumes:  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  … ?

Bisher habe ich alle durchgelesen Docker Compose-Dokumente master-Branch Volumenkonfigurationsreferenz, die Docker Compose-Dokumente Lautstärke / Lautstärke-Treiberreferenz und durchgesehen GitHub Beispiele um die richtige Syntax zu finden, die erwartet wird. Es scheint, dass niemand das bereits benutzt (GitHub) und die Dokumentation ist noch lange nicht vollständig (docker.com ). Ich habe auch versucht, ein separates Volume als zu erstellen service und referenziere es in volumes, aber das funktioniert nicht so gut. Irgendeine Idee, wie diese Syntax aussehen soll?

Zweck der volumes Schlüssel

Es ist da, um zu schaffen benannte Volumes.

Wenn du es tust nicht verwenden Sie es, dann haben Sie eine Reihe von Hash-Werten für Ihre Volumes. Beispiel:

$ docker volume ls DRIVER              VOLUME NAMElocal               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Mit benannten Volumes erhalten Sie etwa Folgendes:

$ docker volume lslocal               projectname_someconflocal               projectname_otherconf

So erstellen Sie benannte Volumes

Der docker-compose.yml syntax ist:

version: '2'services:    app:        container_name: app        volumes_from:            - appconf    appconf:        container_name: appconf        volumes:            - ./Docker/AppConf:/var/www/confvolumes:    appconf:networks:    front:        driver: bridge

Dies ist so etwas wie oben gezeigte benannte Volumes.

So entfernen Sie Volumes in großen Mengen

Wenn Sie eine Reihe von Hashes haben, kann es ziemlich schwierig sein, sie zu bereinigen. Hier ist ein Einzeiler:

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

Bearbeiten: Wie @ArthurTacca in den Kommentaren darauf hingewiesen hat, gibt es einen leichter zu merkenden Weg:

docker volume rm $(docker volume ls -q)

So erhalten Sie Details zu einem benannten Volume

Jetzt, da Sie keine Hashes mehr nachschlagen müssen, können Sie weitermachen und sie bei ihren anrufen … Name:

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"    }]

Randnotiz: Vielleicht möchten Sie docker-compose down ihre Dienste für einen Neuanfang, bevor Sie Volumes erstellen.

Falls Sie verwenden Boot2Docker/ Docker-Maschine, müssen Sie docker-machine ssh und sudo -i bevor Sie eine ls -la /mnt/… von diesem Volume - Ihr Hostcomputer ist die VM, die von bereitgestellt wird Docker-Maschine.

BEARBEITEN: Ein anderer verwandte Antwort zu benannten Volumes auf SO.

So wie ich es verstehe, können Sie das Globale verwenden volumes: abschnitt zu

  • definieren Sie einen Volume-Namen
  • stellen Sie ein benanntes Volume unter einem anderen Volume-Namen zur Verfügung
  • angeben eines Treibers und von Treiberoptionen für ein benanntes Volume

Volumes im globalen Abschnitt werden automatisch erstellt, es sei denn, Sie geben Folgendes an external: true. Sie müssen immer noch jedem Dienst in seinem mitteilen volumes: abschnitt, in dem dieses Volume bereitgestellt werden soll.

Hier ist ein sehr einfaches Beispiel:

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

Global volumes: eintritt für project wird ein benanntes Volume verursachen project geschaffen werden. Es wird dann als montiert /bar in Dienst eins und als /foo im Dienst zwei. Beide Dienste teilen sich die Daten des Volumes und können sie lesen / schreiben.

Ich glaube nicht, dass das, was Sie versuchen, möglich ist (mehrere Pfade in ein einzelnes Volume verwandeln und mit unterschiedlichen r / w-Flags). Wenn es ist dann wahrscheinlich möglich, einen Weg zu finden, ein benanntes Volume mit diesen Eigenschaften auf andere Weise zu erstellen und es dann als externes Volume hinzuzufügen:

volumes:  mymagicvolume:    external: true

Ich denke, was Sie versuchen, ist ungefähr das gleiche wie gesehen hier. Kurz gesagt: Es ist derzeit nicht möglich, ein benanntes Volume zu erstellen, das auf einen Einhängepunkt auf dem Host verweist. Sie können ein benanntes Volume erstellen, um Daten zwischen Containern gemeinsam zu nutzen, aber die Daten sind nur im Volume selbst vorhanden und verschwinden, wenn Sie das Volume löschen.

Die Montage benannter Volumes wurde vorgeschlagen, aber leider wird es in naher Zukunft nicht zum Kern hinzugefügt. Es ist jedoch möglich, ein Docker-Plugin namens zu verwenden lokal-persistent.

Auschecken Ausführung 2 zum Beispiel auch Referenz zur Volumenkonfiguration:

Mein Beispiel: (Version 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$