Docker在测试阶段使用不同的设置文件在CI中运行/ build

时间:2019-10-14 13:55:07

标签: django postgresql docker continuous-integration gitlab-ci

我有gitlab-ci.yml,它运行postgres容器,然后构建一个Web容器。 Web容器具有带有数据库设置的setting.py。

.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中(与settings.py在同一目录中),用硬编码的值替换为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',
    }
}

显然,这与现在无法找到任何数据库配置变量('ENGINE','NAME'等)的码头工人不同,我必须对其进行修复。

该错误是相对描述性的(它来自docker build --pull -t test_image .,而不是docker run ...命令):

  

django.core.exceptions.ImproperlyConfigured:settings.DATABASES是   配置不正确。请提供引擎值。

到目前为止,到目前为止,我有两个建议如何解决此问题: 在.gitlab-ci中,“ docker run命令”应在命令中获得DJANGO_SETTINGS_MODULE env var

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命令,也没有帮助。

我解释该错误,因为它仍在尝试从settings.py获取数据库配置,并且忽略了我尝试通过DJANGO_SETTINGS_MODULE或通过“ -e”开关提供var-by-var值来提供新文件名的尝试。

因此,当我的设置文件不是settings.py而是其他一些文件时,如何正确配置docker rundocker build.gitlab-ci.yml的调用,使它们能够识别数据库配置导入settings.py?

谢谢

更新

最后,系统进行了重新设计,因此所有与DB相关的东西(基本上是迁移)都可以直接从.gitlab-ci.yml中以“ docker exec ...”执行,而无需拖动环境变量

0 个答案:

没有答案