Docker - создание службы после запуска зависимой службы

У меня есть файл docker-compose для приложения Django. Ниже приведена структура моего docker-compose.yml

services:
   private-pypi-server:
                     ....
   django-backend:
      build:
         context: ./backend
         dockerfile: Dockerfile
      depends_on:
          - private-pypi-server
   nginx:
     depends_on:
          - django-backend

Приложение Django зависит от пары частных пакетов, размещенных на private-pypi-server, без которых приложение не будет работать. Я создал отдельный dockerfile только для django-backend, который устанавливает пакеты из requirements.txt и пакеты с private-pypi-server. Но dockerfile службы django-backend запускается еще до запуска частного pypi-сервера. Если я переношу установку частных пакетов в docker-compose.yml команда код под сервисом django-backend в , то все работает нормально. Проблема в том, что если бэкенд запущен и я хочу выполнить некоторые команды в django-backend(./manage.py migrat), то он говорит, что приватные пакеты не установлены.

Я не уверен, как действовать дальше, было бы очень полезно, если бы я мог запустить все эти службы одновременно, просто выполнив команду docker-compose up --build -d

Пробовали ли вы добавить службу pipy в depends_on бэкенд-приложение?

  backend:
    command: "bash ./install-ppr_an_run_dphi.sh"
    build:
      context: ./backend
      dockerfile: ./Dockerfile
    volumes:
      - ./backend:/usr/src/app
    expose:
      - 8000:8000
    depends_on:
      - db
      - pypi-server

Ваш файл docker-compose вызывает несколько вопросов.

  1. Зачем устанавливать пользовательские пакеты в бэкенд-сервис во время выполнения? Я вижу очень много проблем, которые могут возникнуть из-за этого, например, задержка при перезапуске сервиса, возможные различия в окружении между запусками одной и той же версии бэкенд-сервиса, любые проблемы с установкой могут возникнуть во время развертывания, и т.д. Установка должна выполняться во время сборки образа docker. Не могли бы вы предоставить ваш Dockerfile?

  2. Есть ли причины, по которым сервер pipy должен разделять docker-compose с приложением? Я бы предложил разместить его в отдельном развертывании, особенно если он будет использоваться совместно с другими проектами.

    .
  3. Предполагается ли использовать pipy-сервер для чего-то еще, кроме источника пользовательских пакетов для бэкенд-сервиса? Если нет, то я бы подумал о том, чтобы избавиться от него или использовать его только для сборок.

    .
  4. Есть ли веская причина, по которой вы хотите иметь все открытые порты? Это создает значительную поверхность атаки. Например, злоумышленник может обойти обратный прокси и напрямую связаться с внутренней службой, используя порт 8000, или он сможет подключиться к базе данных через порт 3306. Nb docker-compose создает подсети между контейнерами, чтобы они могли получить доступ к портам друг друга, даже если эти порты не проброшены на хост-машину.

  5. Рассмотрите возможность использования docker secrets для хранения учетных данных db.

    .

Создал отдельный docker-compose для pypi-server, который будет запущен еще до того, как я построю/запущу другие сервисы.

Вернуться на верх