Frage Wie soll Docker Compose Version 2 "Volumes" -Syntax aussehen?


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

Was ich versuche zu tun ist Name Volumes in dort und haben einen einzigen Volume-Verweis mehrere Pfad auf meiner lokalen Host-Festplatte. Das folgende Beispiel zeigt eine Ausnahme mit einem 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/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 gelesen Docker Verfassen von Dokumenten master-Ast Volume Konfigurationsreferenz, die Docker Verfassen von Dokumenten Volume / Volume-Treiber Referenz und durchgeschaut GitHub Beispiele um die korrekte Syntax zu finden, die erwartet wird. Es scheint, dass niemand dies bereits benutzt (GitHub) und die Dokumentation ist bei weitem nicht vollständig (docker.com). Ich habe auch versucht, ein separates Volume zu erstellen service und referenziere es in volumes, aber das funktioniert nicht so gut. Irgendeine Idee, wie diese Syntax aussehen soll?


41
2018-03-02 15:16


Ursprung




Antworten:


Zweck der volumes Schlüssel

Es ist dort zu schaffen benannte Volumen.

Wenn Sie tun nicht benutze es, dann wirst du dich mit einer Reihe von Hashwerten für deine Bände wiederfinden. Beispiel:

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

Mit benannten Volumes erhalten Sie etwa Folgendes:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

So erstellen Sie benannte Volumes

Das docker-compose.yml Syntax ist:

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

Dieses etwas wie oben gezeigt benannte Volumen.

So entfernen Sie Volumes in großen Mengen

Wenn Sie eine Reihe von Hashes haben, kann es sehr schwierig sein, sie zu bereinigen. Hier ist ein One-Liner:

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, wo du nicht mehr nachschlagen musst, kannst du weitermachen und sie an ihrem ...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 willst du docker-compose down Ihre Dienste, um einen Neuanfang zu beginnen, bevor Sie Volumes erstellen.

Für den Fall, dass Sie verwenden Boot2Docker/ DockermaschineDu wirst es müssen docker-machine ssh und sudo -i bevor du a ls -la /mnt/… dieses Volumes - Ihr Host-Rechner ist die von Dockermaschine.


40
2018-04-09 14:20



sehr gute Antwort. Prost. Viel zurückgekommen, um neue Docker-Compose-Volumes zu finden. - Derek Adair
Wo hast du diese gefunden? scheint viel gründlicher als die Docker-Dokumentation? - Derek Adair
@DerekAdair Danke, aber wie Sie in den Statistiken oben links nachlesen können, wird diese Antwort in den Google Suchergebnisseiten zu diesem Thema gut referenziert. - kaiser
Anstatt $(docker volume ls |awk '{print $2}') Sie können verwenden $(docker volume ls -q) Dies ist nicht nur einfacher, es druckt in der ersten Zeile nicht "VOLUME". - Arthur Tacca
Das ist nicht richtig; das macht nicht, was es so aussehen lässt. volumes_from ist zu erben die Liste der Volumes aus einem anderen Container. Um ein benanntes Volume zu verwenden, verwenden Sie die Service-Level-Syntax - NAME:DESTund legen Sie den Pfad auf der obersten Ebene fest volumes Schlüssel. Was dieses Beispiel (zum Zeitpunkt des Schreibens dieses) tut, ist ein Standardvolumen in Zusatz zu einem benannten Volume, und das benannte Volume wird einfach nicht verwendet. - trevorj


So wie ich es verstehe, kannst du das Globale benutzen volumes: Abschnitt zu

  • Definieren Sie einen Volume-Namen
  • Machen Sie ein benanntes Volume unter einem anderen Volume-Namen verfügbar
  • Geben Sie eine Treiber- und Treiberoption für ein benanntes Volume an

Volumes im globalen Abschnitt werden automatisch erstellt, sofern Sie nicht angeben external: true. Sie müssen weiterhin jeden Dienst in seinem Namen angeben volumes: Abschnitt, wo das Volume geladen werden soll.

Hier ist ein sehr einfaches Beispiel:

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

Der Globus volumes: Eintrag für project wird ein benanntes Volume verursachen project erstellt werden. Es wird dann als gemountet /bar im Dienst eins, und als /foo im Dienst zwei. Beide Dienste teilen die Daten des Volumes und können sie lesen / schreiben.

Ich glaube nicht, dass das, was Sie versuchen zu tun, möglich ist (mehrere Pfade in ein einziges Volume umzuwandeln und mit verschiedenen r / w-Flags). Ob es ist möglich, dann wahrscheinlich einen Weg zu finden, ein benannter Datenträger mit diesen Eigenschaften auf andere Weise zu erstellen und ihn dann als externen Datenträger hinzuzufügen:

volumes:
  mymagicvolume:
    external: true

13
2018-04-02 21:56



Bereits upvoted, aber gerade heute Zeit gefunden, um es zu umgehen und erweiterte Daten hinzugefügt. Danke für deine Hilfe! Frage: Wie Sie das Volumen benennen project und dann referenziere es als project:/bar, wo sind project Pfade tatsächlich definiert? - kaiser
docker-compose erstellt diese automatisch als benannte Volumes unter / var / lib / docker / volumes / volumenname - JamesCW
Entschuldigung, verstehe immer noch nicht, wo Docker einen Pfad für bekommen project: alias? Wie weiß Hafenarbeiter, wenn ich teilen möchte, sagen ./some_folder/some_subfolder/yet_another_subfolder zum one: und two: Behälter? - Alexander Lomia
In diesem Fall ist es "project: <whateverpath>" unter der obersten Ebene: Abschnitt - Balint Bako


Auschecken Version 2 zum Beispiel auch Volume-Konfigurationsreferenz:

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
$ 

5
2018-03-02 21:48



Genau das habe ich in der Frage verlinkt und beantworte daher meine Frage nicht. Würde es Ihnen etwas ausmachen, ein Beispiel zu veröffentlichen, wie Sie verschiedene Verzeichnisse vom Host als benanntes Volume mehreren Diensten zuordnen können? - kaiser
meine Verbindung IST anders, es zeigt auf Version 2 Abschnitt des Dokuments) - alexus
Mein Fehler. Ich habe einfach vergessen, das auch zu verlinken. Wenn Sie sich die YML-Inhalte in der Frage ansehen, können Sie sehen, dass ich eindeutig versucht habe, mit der separaten obersten Ebene herumzukommen volumesSchlüssel - was ich nicht getan habe, daher die Frage. Was ich nicht verstehe, ist was docker-compose.yml Teil mit Version 1 Syntax soll mir erklären. - kaiser


Ich denke, was du versuchst zu tun, ist ungefähr dasselbe wie gesehen Hier. Kurz gesagt: Es ist derzeit nicht möglich, ein benanntes Volume zu erstellen, das auf einen Bereitstellungspunkt auf dem Host verweist. Sie können ein benanntes Volume erstellen, um Daten zwischen Containern gemeinsam zu nutzen. Die Daten sind jedoch nur auf dem Volume selbst vorhanden und verschwinden, wenn Sie das Volume löschen.

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


5
2018-06-15 12:20



Montieren von benannten Volumes  Jetzt ist eine Sache ... seit 1.11 oder 1.12. - kaiser
Es scheint so, ja. Vielen Dank! - Sander