Совместное использование томов между отдельными файлами докеров - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь разрешить nginx прокси между несколькими контейнерами и одновременно получать доступ к статическим файлам из этих контейнеров.

Чтобы разделить тома между контейнерами, созданными с помощью docker compose, правильно работает следующее:

version: '3.6'

services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: webtest
    command: ./start.sh
    volumes:
      - .:/code
      - static-files:/static/teststaticfiles

  nginx:
    image: nginx:1.15.8-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx-config:/etc/nginx/conf.d
      - static-files:/static/teststaticfiles
    depends_on:
      - web

volumes:
  static-files:

Однако на самом деле мне нужно, чтобы файл nginx compose находился в отдельном файле, а также в совершенно другой папке. Другими словами, команды docker compose up будут выполняться отдельно. Я пробовал следующее:

Первый составной файл:

version: '3.6'

services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: webtest
    command: ./start.sh
    volumes:
      - .:/code
      - static-files:/static/teststaticfiles
    networks:
      - directorylocation-nginx_mynetwork

volumes:
  static-files:

networks:
  directorylocation-nginx_mynetwork:
    external: true

Второй составной файл (например, nginx):

version: '3.6'

services:
  nginx:
    image: nginx:1.15.8-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx-config:/etc/nginx/conf.d
      - static-files:/static/teststaticfiles
    networks:
      - mynetwork

volumes:
  static-files:

networks:
  mynetwork:

Два вышеупомянутых файла работают правильно в том смысле, что сайт можно просматривать. Проблема в том, что статические файлы недоступны в контейнере nginx. Поэтому сайт отображается без изображений и т. Д.

Одна из работ, которая работает правильно , найденная здесь , состоит в том, чтобы изменить объем статических файлов контейнера nginx следующим образом:

- /var/lib/docker/volumes/directory_static-files/_data:/static/teststaticfiles

Вышеупомянутое работает правильно, но кажется «хакерским» и ломким. Есть ли другой способ разделить тома между контейнерами, которые размещены в разных файлах составления, без необходимости сопоставлять каталог /var/lib/docker/volumes.

1 Ответ

0 голосов
/ 05 января 2019

Разделяя файлы 2 docker-compose.yml, как вы делали в своем вопросе, фактически создаются 2 разных тома; По этой причине вы не видите данные из сервиса web внутри тома сервиса nginx, потому что есть только 2 разных тома.

Пример: допустим, у вас есть следующая структура:

example/
    |- web/
        |- docker-compose.yml # your first docker compose file
    |- nginx/
        |- docker-compose.yml # your second docker compose file

Запуск docker-compose up из папки web (или docker-compose -f web/docker-compose.yml up из каталога example) фактически создаст том с именем web_static-files (имя тома, определенного в файле docker-compose.yml, с префиксом папки, в которой находится этот файл).

Итак, запуск docker-compose up из папки nginx фактически создаст nginx_static-files вместо повторного использования web_static-files, как вы хотите.

Вы можете использовать том, созданный с помощью web/docker-compose.yml, указав в файле компоновки 2-го докера (nginx/docker-compose.yml), что это внешний том, и его имя:

volumes:
  static-files:
    external:
      name: web_static-files

Обратите внимание, что если вы не хотите, чтобы том (и все ресурсы) начинался с префикса имени папки (по умолчанию), а с помощью чего-то еще, вы можете добавить опцию -p к команде docker-compose:

docker-compose \
    -f web/docker-compose.yml \
    -p abcd \
    up

Эта команда теперь создаст том с именем abcd_static-files (который можно использовать во втором файле компоновки Docker).

Вы также можете определить создание томов в отдельном файле docker-compose (например, volumes/docker-compose.yml):

version: '3.6'

volumes:
  static-files:

И ссылаться на этот том как на внешний, с именем volumes_static-files, в web и nginx docker-compose.yml файлах:

volumes:
  static-files:
    external:
      name: volumes_static-files

К сожалению, вы не можете установить имя тома в docker compose, оно будет автоматически иметь префикс. Если это действительно проблема, вы также можете создать том вручную (docker volume create static-files) перед выполнением любой команды docker-compose up (хотя я не рекомендую это решение, потому что оно добавляет ручной шаг, который можно забыть, если вы воспроизводите развертывание на другое окружение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...