Wie soll die Datenträgersyntax von Docker Compose Version 2 aussehen?

43

Mit Docker Compose v1.6.0 + gibt es jetzt eine neue / Version 2-Dateisyntax für die docker-compose.ymlDatei. Die Änderungen enthalten einen separaten Schlüssel der obersten Ebene mit dem Namen volumes. Auf diese Weise können Datenträgerdefinitionen an einem Ort "zentralisiert" werden.

Ich versuche, Volumes dort zu benennen und auf meinem lokalen Host-Datenträger einen einzelnen Volume-Verweis mit mehreren Pfaden zu haben. Das folgende Beispiel löst eine Ausnahme mit einem aus Traceback, das mit endet

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/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
  … ?

Bisher habe ich alle Referenzinformationen zu Docker Compose docs master-branch Volume sowie die Referenzinformationen zu Docker Compose docs Volume / Volume-Driver gelesen und anhand von GitHub-Beispielen die korrekte Syntax ermittelt, die erwartet wird. Es sieht so aus, als ob das noch niemand benutzt (GitHub) und die Dokumentation ist noch lange nicht vollständig (docker.com). Ich habe auch versucht, ein separates Volume als zu erstellen serviceund darauf zu verweisen volumes, aber das funktioniert nicht so gut. Irgendeine Idee, wie diese Syntax aussehen soll?

Kaiser
quelle

Antworten:

40

Zweck des volumesSchlüssels

Hiermit können Sie benannte Volumes erstellen .

Wenn Sie es nicht verwenden, werden Sie mit einer Reihe von Hash-Werten für Ihre Volumes konfrontiert. Beispiel:

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

Bei benannten Volumes erhalten Sie etwa Folgendes:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

So erstellen Sie benannte Volumes

Die docker-compose.ymlSyntax lautet:

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

Dies ist etwa das oben gezeigte benannte Volumen.

So entfernen Sie Volumes in loser Schüttung

Wenn Sie eine Reihe von Hashes haben, kann es ziemlich schwierig sein, aufzuräumen. Hier ist ein Einzeiler:

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

Edit: Wie @ArthurTacca in den Kommentaren hervorhob, gibt es einen einfacheren Weg, sich zu erinnern:

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 sie beim  Namen nennen:

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

Nebenbemerkung: Möglicherweise möchten Sie, dass docker-compose downIhre Dienste einen Neustart durchführen, bevor Sie Volumes erstellen.

Wenn Sie Boot2Docker / Docker- Computer verwenden , müssen Sie docker-machine sshund sudo -ibevor Sie einen ls -la /mnt/…dieser Volumes ausführen - der Host-Computer ist die von Docker- Computer bereitgestellte VM .

Kaiser
quelle
1
sehr gute antwort. Prost. Es wurde viel aufgeräumt, um neue Docker-Compose-Volumes zu finden.
Derek Adair
Wo haben Sie diese gefunden? scheint viel gründlicher als die Docker-Dokumente?
Derek Adair
1
@DerekAdair Danke, aber wie Sie in den Statistiken oben links nachlesen können, wird diese Antwort auf den Ergebnisseiten der Google-Suchmaschine zu diesem Thema gut referenziert.
Kaiser
1
Stattdessen $(docker volume ls |awk '{print $2}')können Sie verwenden. $(docker volume ls -q)Dies ist nicht nur einfacher, es wird auch nicht "VOLUME" in der ersten Zeile gedruckt.
Arthur Tacca
2
Das ist nicht richtig; das tut nicht das, was es so erscheinen lässt. volumes_frombesteht darin, die Liste der Volumes von einem anderen Container zu erben . Um ein benanntes Volume zu verwenden, verwenden Sie die Service-Level-Syntax - NAME:DESTund legen den Pfad im volumesSchlüssel der obersten Ebene fest . In diesem Beispiel wird (zum Zeitpunkt des Schreibens) zusätzlich zu einem benannten Volume ein Standard- Volume erstellt, und das benannte Volume wird einfach nicht verwendet.
Trevorj
13

So wie ich es verstehe, können Sie den globalen volumes:Abschnitt verwenden, um

  • Definieren Sie einen Datenträgernamen
  • Stellen Sie ein benanntes Volume unter einem anderen Volume-Namen zur Verfügung
  • Geben Sie einen Treiber und Treiberoptionen für ein benanntes Volume an

Volumes im globalen Bereich werden automatisch erstellt, sofern Sie dies nicht angeben external: true. Sie müssen weiterhin jedem Dienst in seinem volumes:Abschnitt mitteilen, wo dieser Datenträger bereitgestellt werden soll.

Hier ist ein sehr einfaches Beispiel:

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

Der globale volumes:Eintrag für projectbewirkt, dass ein benanntes Volume projecterstellt wird. Es wird dann wie /barin Service eins und wie /fooin Service zwei gemountet . Beide Dienste teilen die Daten des Datenträgers und können sie lesen / schreiben.

Ich glaube nicht, dass das, was Sie versuchen, möglich ist (mehrere Pfade in ein einziges Volume und mit unterschiedlichen R / W-Flags verwandeln). Wenn dies möglich ist, suchen Sie wahrscheinlich nach einer Möglichkeit, ein benanntes Volume mit diesen Eigenschaften auf andere Weise zu erstellen, und fügen Sie es dann als externes Volume hinzu:

volumes:
  mymagicvolume:
    external: true
Puzzle
quelle
1
Bereits upvoted, aber erst heute Zeit gefunden, um es zu umgehen und eine erweiterte Daten hinzugefügt. Danke für deine Hilfe! Frage: Wenn Sie das Volume benennen projectund dann darauf verweisen project:/bar, wo sind die projectPfade tatsächlich definiert?
Kaiser
docker-compose erstellt sie automatisch als benannte Volumes unter / var / lib / docker / volume / volumename
JamesCW
Entschuldigung, ich verstehe immer noch nicht, woher Docker einen Pfad für den project:Alias bezieht ? Wie weiß Docker , wenn ich teilen möchte, sagen ./some_folder/some_subfolder/yet_another_subfolderzu der one:und two:Behälter?
Alexander Lomia
In diesem Fall ist es "project: <whateverpath>" unter der Top-Level-Bände: Abschnitt
Balint Bako
5

Schauen Sie sich beispielsweise Version 2 an, auch die Referenz zur Volume-Konfiguration :

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
$ 
alexus
quelle
1
Genau das habe ich in der Frage verlinkt und daher meine Frage nicht beantwortet. Würde es Ihnen etwas ausmachen, ein Beispiel für die Zuordnung verschiedener Verzeichnisse vom Host als benanntes Volume zu mehreren Diensten zu veröffentlichen?
Kaiser
meine Verbindung IS anders, es verweist auf Version 2Abschnitt des Dokuments)
alexus
Mein Fehler. Ich habe einfach vergessen, diesen auch zu verlinken. Wenn Sie sich das YML-Zeug in der Frage ansehen, können Sie sehen, dass ich eindeutig versucht habe, mit dem separaten volumesSchlüssel der obersten Ebene umzugehen - was ich nicht getan habe, daher die Frage. Was ich nicht verstehe, ist das, was der docker-compose.ymlTeil mit der Syntax von Version 1 mir erklären soll.
Kaiser
5

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

Das Mounten benannter Volumes wurde vorgeschlagen , wird aber in naher Zukunft leider nicht zum Core hinzugefügt. Es ist jedoch möglich, ein Docker-Plugin mit dem Namen local-persist zu verwenden .

Sander
quelle
3
Das Mounten benannter Volumes ist jetzt eine Sache … seit 1.11 oder 1.12.
Kaiser