web-dev-qa-db-fra.com

Docker Compose - Partager le volume nommé entre plusieurs conteneurs

J'utilise docker-compose et v3. J'essaye de monter un volume dans docker:

./appdata:/appdata

J'aimerais que ce soit un volume, puis que ce volume soit référencé à partir de plusieurs conteneurs. Le référence de configuration de volume n'affiche que data-volume: sous forme de volume nommé, sans valeur; il ne ressemble donc pas à ce qui est décrit ci-dessus.

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

Cela me donne:

ERREUR: dans le fichier './docker-compose.yml', le volume 'app-volume' doit être un mappage et non une chaîne.

De toute évidence, je sais que je dois changer la paire clé/valeur volumes, mais je ne suis pas sûr comment changer cela pour pouvoir partager un volume entre services.

J'ai aussi vérifié volumes_from mais cela n'autorise en réalité que l'héritage d'autres conteneurs. J'ai vu quelqu'un utiliser volumes_from sur un autre conteneur contenant le mappage souhaité, mais avec command: true défini de sorte que le conteneur ne soit jamais réellement exécuté, ce qui me semble être un hack.

Comment puis-je faire ceci?


Notez que je fais le fonctionnement suivant:

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

Mais ce n’est que du dédoublement et j’espère qu’un volume nommé pourra m'aider à éviter :-)

61
Jimbo

Les volumes nommés peuvent être partagés entre les conteneurs de la manière suivante:

_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: 
_

Voici un exemple de configuration que j'utilise pour une meilleure compréhension. J'expose les fichiers statiques générés à partir de mon conteneur web à un volume nommé appelé _static-content_, qui est ensuite lu et servi par le conteneur nginx:

_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:
_
89
Kannaj

Cela résout le problème sans utiliser les volumes nommés:

      volumes:
          - ./appdata:/appdata

Donc, ça ressemble à:

services:

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

  php:
      build: ./php/
      expose:
          - 9000
      volumes:
          - ./appdata:/appdata
20
Robert