Docker запускает / строит CI с другим файлом настроек для стадии тестирования - PullRequest
0 голосов
/ 14 октября 2019

У меня был 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 ..." и нет необходимости перетаскивать переменные среды вокруг

...