У меня был gitlab-ci.yml, который запускает контейнер postgres, а затем создает веб-контейнер. В веб-контейнере есть файл setting.py с настройкой DATABASES.
.gitlab-ci.yml:
...
test:
stage: test
script:
- docker run --name db -d postgres:9.6
- docker build --pull -t test_image .
- docker run --name <mywebapp> ...blah-blah
...
setting.py
....
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'dbname',
'USER': 'dbuser',
'PASSWORD': 'dbpassword',
'HOST': 'db',
'PORT': '5432', #or nothing, worked either way
}
}
....
ВсеЭто работало нормально в конвейерах CI до недавних изменений.
Изменения были следующими: раздел DATABASE был перемещен из settings.py в postgres.py (в том же каталоге, где и g settings.py) с помощью hard-закодированные значения заменены на os.environ.get('SOME VAR')
звонки, и settings.py теперь импортируется в postgres.py:
postgres.py
from <mywebapp>.settings.settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ.get('DB_NAME', ''),
'USER': os.environ.get('DB_USER', ''),
'PASSWORD': os.environ.get('DB_PASS', ''),
'HOST': os.environ.get('DB_HOST', ''),
'PORT': '5432',
}
}
Очевидно, что это не соответствуетс докером, который теперь не может найти ни одного из конфигурационных переменных БД («ДВИГАТЕЛЬ», «ИМЯ» и т. д.), и я должен это исправить.
Ошибка является относительно описательной (она поступает из docker build --pull -t test_image .
, а не из команды docker run ...
):
django.core.exceptions.ImproperlyConfigured: settings.DATABASES неправильно настроен,Пожалуйста, укажите значение ENGINE.
До сих пор я получил два предложения, как это исправить: в .gitlab-ci «команда запуска docker» должна получить DJANGO_SETTINGS_MODULE
env var the in command:
docker run --name db -p 5432:5432 -e DJANGO_SETTINGS_MODULE=<mywebapp>.settings.postgres -d postgres:9.6
docker build --pull -t test_image .
а второй - передать все переменные, задействованные в командной строке, просто с префиксом «POSTGRES_» вместо префикса «DB_» по какой-то причине вместе с DJANGO_SETTINGS_MODULE (или без, я пыталсяоба), то есть:
docker run --name db \
-e POSTGRES_ENGINE=django.db.backends.postgresql_psycopg2 \
-e POSTGRES_MULTIPLE_DATABASES=<dbname> \
-e POSTGRES_USER=<dbuser> \
-e POSTGRES_PASSWORD=<dbpassword> \
-e DJANGO_SETTINGS_MODULE=<mywebapp>.settings.postgres \
-d postgres:9.6
docker build --pull -t test_image .
Ни один из подходов не изменил ошибку, которую я получаю от docker build .
.
Я также пытался передать команду --build-arg DJANGO_SETTINGS_MODULE=<mywebapp>.settings.postgres
в docker build
, никакой помощи тоже.
Я интерпретирую ошибку, поскольку она все еще пытается получить данные конфигурации db из settings.py и игнорирует мои попытки предоставить новое имя файла с помощью DJANGO_SETTINGS_MODULE или значений var-by-var с ключом "-e".
Итак, как правильно настроить вызовы для docker run
и docker build
в .gitlab-ci.yml
, чтобы они учитывали конфигурацию БД, когда мой файл настроек - это не файл settings.py, а какой-то другой файл, который импортирует настройки. py?
Спасибо
ОБНОВЛЕНИЕ
В конце система была переработана, так что все связанные с БД вещи (миграции, в основном) выполняются напрямуюиз .gitlab-ci.yml
с "docker exec
..." и нет необходимости перетаскивать переменные среды вокруг