Docker Compose - общий объем имен между несколькими контейнерами

Я использую docker-compose и v3. Я пытаюсь установить том в докере:

./appdata:/appdata

Я хотел бы иметь это как том, а затем ссылаться на этот том из нескольких контейнеров. ссылка на конфигурацию тома показывает только data-volume: как именованный том без значения, поэтому он не выглядит так.

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

Это дает мне:

ОШИБКА: В файле './docker-compose.yml' том 'app-volume' должен быть отображением, а не строкой.

Очевидно, я знаю, что мне нужно изменить пару ключ/значение volumes, но я не уверен, как изменить это, чтобы я мог делиться томом между службами.

Я также проверил volumes_from, но это фактически просто наследует от других контейнеров. Я видел, как кто-то использовал volumes_from в другом контейнере, который содержит нужное им отображение, но с command: true установлено так, что контейнер никогда не запускается, что для меня просто похоже на хак.

Как я могу это сделать?


Обратите внимание, что у меня есть следующее:

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

Но это просто дублирование и я надеюсь, что именованный том поможет мне избежать: -)

Ответ 1

Именованные тома могут быть разделены между контейнерами следующим образом:

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: 

Вот пример конфигурации, который я использую для лучшего понимания. Я выставляю статические файлы, сгенерированные из моего web контейнера, на именованный том, называемый static-content который затем читается и обслуживается контейнером 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:

Ответ 2

Это разрешает его без использования именованных томов:

      volumes:
          - ./appdata:/appdata

Итак, это выглядит так:

services:

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

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