Docker -compose - Как заполнить данные контейнера другим контейнером? - PullRequest
0 голосов
/ 19 апреля 2020

Мой docker -компонентный файл имеет следующий вид:

version: '3'

services:
  database:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: qwerty
      POSTGRES_USER: qwerty

  backend:
    depends_on:
      - database
    build:
      #Dockerfile used here will use python image,build the django project and run using uwsgi in port 4000
      context: .
      dockerfile: dockerfile_uwsgi
    ports:
      - "4000:4000"
    image: backend_img
    environment:
      DB_HOST: database
      DB_NAME: qwerty
      DB_USER: qwerty
      DB_PASSWORD: qwerty

  migration:
    depends_on:
      - backend
    image: backend_img
    entrypoint: ["sh", "-c"]
    command: ["
      python manage.py collectstatic --noinput;
      python manage.py makemigrations;
      python manage.py migrate;"]
    environment:
      DB_HOST: database
      DB_NAME: qwerty
      DB_USER: qwerty
      DB_PASSWORD: qwerty

  frontend:
    depends_on:
      - backend
    build:
      #The dockerfile used her uses nginx image, it is configured to act as reverse proxy and serve static files.
      context: .
      dockerfile: dockerfile_nginx
    ports:
      - "9443:8443"


Объяснение о docker-compose.yaml: здесь внутренний контейнер настраивает проект django и обслуживает проект с использованием uwsgi, используя то же изображение Контейнер миграции будет собирать файлы stati c из всех каталогов приложения и заполнять их в текущем рабочем каталоге контейнера. Контейнер внешнего интерфейса - nginx, который действует как обратный прокси-сервер. Также я хотел бы подать файлы stati c из контейнера nginx.

Проблема, с которой я здесь сталкиваюсь, заключается в том, что я хочу, чтобы файлы stati c, созданные контейнером миграции, появлялись во внешнем интерфейсе. контейнер. Так что nginx может обслуживать файлы c. Как это можно сделать? Если предположим, что дизайн не должен быть таким, как он показан здесь, пожалуйста, предложите мне, как это можно изменить, чтобы выполнить требование?

Я знаю, что с помощью общего тома это можно сделать. Но я не хочу использовать общий том, так как данные, заполняемые на общий том, сохранятся в нем и предположим, что если разработчик изменит содержимое stati c в папке приложения, изменения не будут внесены в том, если только монтирование тома точка сливается. Это основано на том, что я наблюдал, пожалуйста, поправьте меня, если я ошибаюсь.

1 Ответ

1 голос
/ 19 апреля 2020

Что бы ни обслуживало ваши ресурсы на слое docker - gunicorn, uwsgi, что угодно - вероятно, будет поддерживать обслуживание stati c активов и может делать это значительно более эффективно, чем само django.

В вашей ситуации nginx является по существу внешним по отношению к вашему приложению. Вместо того, чтобы пытаться «перевести ваши ресурсы c в nginx», пусть клиенты выполняют эту работу и кэшируют их в nginx после прокси. Nginx имеет хорошую поддержку кэширования.

Если вы действительно хотите получить активы stati c в a, вы можете COPY --from=... как в https://docs.docker.com/develop/develop-images/multistage-build/ скопировать активы stati c в свой пользовательский nginx контейнер. Используйте контейнер django в качестве источника - вам нужно убедиться, что он построил после вашего django контейнера. Это может быть невозможно полностью в docker -compose. Там есть законное трение; у вас возникнут те же проблемы, когда / если вы попытаетесь создать и развернуть docker артефактов на производственных серверах.

...