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
вызывает несколько вопросов.
Зачем устанавливать пользовательские пакеты в бэкенд-сервис во время выполнения? Я вижу очень много проблем, которые могут возникнуть из-за этого, например, задержка при перезапуске сервиса, возможные различия в окружении между запусками одной и той же версии бэкенд-сервиса, любые проблемы с установкой могут возникнуть во время развертывания, и т.д. Установка должна выполняться во время сборки образа docker. Не могли бы вы предоставить ваш Dockerfile?
Есть ли причины, по которым сервер pipy должен разделять
.docker-compose
с приложением? Я бы предложил разместить его в отдельном развертывании, особенно если он будет использоваться совместно с другими проектами.Предполагается ли использовать pipy-сервер для чего-то еще, кроме источника пользовательских пакетов для бэкенд-сервиса? Если нет, то я бы подумал о том, чтобы избавиться от него или использовать его только для сборок.
.Есть ли веская причина, по которой вы хотите иметь все открытые порты? Это создает значительную поверхность атаки. Например, злоумышленник может обойти обратный прокси и напрямую связаться с внутренней службой, используя порт 8000, или он сможет подключиться к базе данных через порт 3306. Nb
docker-compose
создает подсети между контейнерами, чтобы они могли получить доступ к портам друг друга, даже если эти порты не проброшены на хост-машину.Рассмотрите возможность использования docker secrets для хранения учетных данных db.
.
Создал отдельный docker-compose для pypi-server, который будет запущен еще до того, как я построю/запущу другие сервисы.