Docker Compose - Teilen Sie das benannte Volume zwischen mehreren Containern

104

Ich benutze Docker-Compose und v3. Ich versuche, ein Volume in Docker bereitzustellen:

./appdata:/appdata

Ich möchte dies als Volume haben und dann auf dieses Volume aus mehreren Containern verweisen. Die Volume-Konfigurationsreferenz wird nur data-volume:als benanntes Volume ohne Wert angezeigt, sodass sie nicht wie oben beschrieben aussieht.

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume

volumes:
     app-volume: ./appdata:/appdata

Das gibt mir:

FEHLER: In der Datei './docker-compose.yml' muss das Volume 'app-volume' eine Zuordnung und keine Zeichenfolge sein.

Natürlich weiß ich, dass ich das volumesSchlüssel / Wert-Paar ändern muss, aber ich bin mir nicht sicher, wie ich das ändern soll, damit ich ein Volume zwischen den Diensten teilen kann.

Ich habe auch ausgecheckt, volumes_fromaber dies ermöglicht effektiv nur die Vererbung von anderen Containern. Ich habe jemanden gesehen, der einen volumes_fromanderen Container verwendet, der das gewünschte Mapping enthält, aber mit command: trueset, damit der Container nie ausgeführt wird, was mir nur wie ein Hack erscheint.

Wie kann ich das machen?


Beachten Sie , ich tun haben folgende Arbeiten:

nginx:
    volumes:
        - ./appdata:/appdata
php:
    volumes:
        - ./appdata:/appdata

Aber das ist nur eine Vervielfältigung und ich hoffe, dass ein benannter Band mir helfen könnte, dies zu vermeiden :-)

Jimbo
quelle
Sie finden die Antwort in dieser Antwort: stackoverflow.com/a/49920624
Isen Ng

Antworten:

141

Die genannten Volumes können auf folgende Weise für mehrere Container freigegeben werden:

services:
    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume:location_in_the_container

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume:location_in_the_container

volumes:
     app-volume: 

Hier ist eine Beispielkonfiguration, die ich zum besseren Verständnis verwende. Ich mache die statischen Dateien, die aus meinem webContainer generiert wurden , einem benannten Volume zugänglich, static-contentdas dann gelesen und vom nginxContainer bereitgestellt wird:

services:
  nginx:
    container_name: nginx
    build: ./nginx/

    volumes:
      - static-content:/usr/src/app

  web:
    container_name: web
    env_file: .env
    volumes:
      - static-content:/usr/src/app/public
    environment:
      - NODE_ENV=production

    command: npm run package

volumes:
  static-content:
Kannaj
quelle
77
Wo legen Sie den Speicherort static_contentim Host-Dateisystem fest?
Travis Bear
10
Whitespace in app-volume: location_in_the_containerist falsch.
Hasufell
4
Was ist, wenn /usr/src/appim nginxContainer und /usr/src/app/publicim webContainer beide Originalinhalte haben, welcher wird verwendet und warum?
jallen0927
2
@TravisBear Für diesen Anwendungsfall (gemeinsame Nutzung von Daten zwischen Containern) muss diese nicht unbedingt auf dem Host vorhanden sein. Ein Beispiel mit statischen Daten ist großartig - Sie führen collectstaticin einem Container aus und möchten, dass die Ergebnisse in einem anderen verfügbar sind, aber Sie interessieren sich nicht für den Host-Ordner
The Godfather
7
@Kannaj TravisBears Frage ist die, die das Problem, das ich am verwirrendsten finde, richtig identifiziert. Wie können Sie in der Erstellungsdatei angeben, woher das benannte Volume stammt? Ich möchte es nicht der Docker-Engine überlassen, zu bestimmen, wo das benannte Volume auf dem Host gespeichert werden soll. Ich möchte einen Pfad angeben.
Ben Collins
32

Dies löst es ohne Verwendung benannter Volumes:

      volumes:
          - ./appdata:/appdata

Es sieht also so aus:

services:

  nginx:
      build: ./nginx/
      ports:
          - 80:80
      links:
          - php
      volumes:
          - ./appdata:/appdata

  php:
      build: ./php/
      expose:
          - 9000
      volumes:
          - ./appdata:/appdata
Robert
quelle
3
Ah, schönes Timing! Ich habe das oben gemacht (siehe meine Änderung). Es scheint jedoch, dass wir das Mapping immer noch duplizieren. Wenn ich dies über 3 Behälter benutze, wird es groß. Können wir benannte Container verwenden, um diese Duplizierung zu vermeiden?
Jimbo
Die Sache ist, dass es bei benannten Volumes nicht nur um Syntax und klaren Code geht. Es wird ein Volume im Docker-Dateninstallationsverzeichnis erstellt, und Sie haben dort keine lokalen Dateien (die ./appdata). Ist es trotzdem nützlich für dich?
Robert
1
Ich brauche auf jeden Fall das ./appdata, das versuche ich zu tun. Lassen Sie diese Antwort hier jedoch :) +1
Jimbo
2
Was passiert, wenn ich zwei Container desselben Bildes habe, die eine Datei (über den Upload-Dateidienst) in einen Container hochladen und in dem anderen verfügbar sind? Wenn nicht, wie kann ich das tun?
Magnoz
1

Die Docker-benannten Volumes wurden ab Version Docker-Compose 3 entfernt.

Sie können jedoch Erweiterungsfelder verwenden , um das Duplizieren der Volume-Quelle zu vermeiden und sich vor zukünftigen Tippfehlern zu schützen:

version: '3.5'

x-services-volume:
  &services-volume
  type: bind
  source: ./appdata
  target: /appdata

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes: *services-volume

    php:
        build: ./php/
        expose:
            - 9000
        # Use same way as for nginx if target override not needed.
        volumes:
            - <<: *services-volume
            target: /opt/target-override

HINWEIS: Diese Funktion ist ab dem Dateiformat Version 3.4 verfügbar.

Andriy Ivaneyko
quelle
Wenn das * services-volume nur ein Zeiger auf den oben eingestellten Wert ist, sieht das fantastisch aus ... Ich muss es versuchen.
Jimbo
@ Jimbo ja, es ist auch zu beachten, dass Docker-Compose-Dateiversion 3.4+ sein soll
Andriy Ivaneyko
2
Benannte Volumes, auch bekannt als Top-Level- volumesFeld, scheinen in Version 3 vondocker-compose immer noch eine Sache zu sein .
Alex Povel