Джанго 2.2.
docker 19.03.2
Я запускаю конвейер CI в gitlab. Этап выполняет несколько шагов:
Сначала я запускаю контейнер БД:
docker run --name db -p 5432:5432 \
-e DJANGO_SETTINGS_MODULE=<myapp>.settings.postgres -d postgres:9.6
Обратите внимание, что я указываю файл настроек не по умолчанию (который содержит мои учетные данные БД)
Затем я проверяю, сработало ли это:
docker inspect db
true
Теперь я создаю веб-контейнер с Django 2.2 внутри и передаю ему учетные данные DB контейнера postgres:
docker build --pull -t test_image . \
--build-arg DB_NAME=<mydbname> \
--build-arg DB_HOST=db \
--build-arg DB_USER=<mydbuser> \
--build-arg DB_PASS=<mydbpassword>
Некоторые пояснения здесь: Dockerfile принимает переменные следующим образом:
...
ARG DB_NAME
ARG DB_HOST
ARG DB_PASSWORD
ARG DB_USER
ENV DB_NAME=$DB_NAME
ENV DB_HOST=$DB_HOST
ENV DB_PASS=$DB_PASS
ENV DB_USER=$DB_USER
....
Теперь docker build
запускает Dockerfile
последовательность из многих шагов и в какой-то момент приходит к миграции в Django DB:
RUN python manage.py migrate --settings <myapp>.settings.postgres
, которая неизменно задыхается от этой ошибки:
django.db.utils.OperationalError: не удалось подключиться к серверу: соединение отклонено Сервер работает на хосте "db"(127.0.0.1) и принимать соединения TCP / IP через порт 5432?
Что, я думаю, означает, что имя, которое я дал контейнеру postgres (" db ") при его запуске, не означаетчто-нибудь внутри этого (веб) контейнера.
Я проверил переменные db redentials перед этапом "migrate" (только что напечатанным с помощью echo) - все они сделали это нормально.
Я также провел несколько экспериментов, добавляя --add-host=db:127.0.0.1
(и --add-host=db:localhost
) к обоим docker run --name db ...
и docker build ..
командам и --expose=5432
к docker run --name db ...
, и получил ту же ошибку.
Как мне правильно запустить "python manage.py migrate
" изнутри сборки (Dockerfile) веб-контейнера ПРОТИВ БД В БД, КОНТЕЙНЕР, КОТОРЫЙ НАЧАЛСЯ ДО ЭТОГО?
ОБНОВЛЕНИЕ В конце я перепроектировал систему. Миграция выполняется из .gitlab_ci.yml, а не изнутри контейнера. Таким образом, мне нужно получить IP-адрес от "Docker Inspect -f ..."