我有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 run
中docker build
和.gitlab-ci.yml
的调用,使它们能够识别数据库配置导入settings.py?
谢谢
更新
最后,系统进行了重新设计,因此所有与DB相关的东西(基本上是迁移)都可以直接从.gitlab-ci.yml
中以“ docker exec
...”执行,而无需拖动环境变量