
在使用gitlab ci/cd的docker executor时,将数据库(如postgresql)作为服务添加到流水线中是一种常见模式。然而,开发者经常会遇到连接失败的问题,例如psycopg.operationalerror: connection is bad: name or service not known。这通常意味着以下两种情况之一:
PostgreSQL Docker镜像在启动时有特定的要求,其中最关键的是POSTGRES_PASSWORD环境变量。如果未设置此变量,PostgreSQL容器将无法正常启动,导致任何尝试连接的请求都会失败。
为了诊断服务容器的启动状态,GitLab Runner提供了一个非常有用的环境变量:CI_DEBUG_SERVICES。将其设置为true,Runner将输出所有服务容器的日志,从而帮助我们发现潜在的启动错误。
示例:启用服务调试
variables:
CI_DEBUG_SERVICES: 'true' # 启用服务容器日志输出
image: python:3.11
default:
services:
- postgres:15.1 # 此时如果缺少POSTGRES_PASSWORD,日志会报错
before_script:
- echo "Starting CI job..."
build-python:
stage: build
script:
- echo "This is a test job"在上述配置中,如果postgres:15.1服务缺少POSTGRES_PASSWORD,CI_DEBUG_SERVICES: 'true'将会在作业日志中显示PostgreSQL容器的启动错误信息,明确指出缺少必要的环境变量。
一旦确定是POSTGRES_PASSWORD缺失导致服务启动失败,我们需要在.gitlab-ci.yml中为postgres服务提供此变量。服务相关的环境变量应定义在default或特定作业的services块下方的variables部分。
示例:配置PostgreSQL服务
image: python:3.11
default:
services:
- name: postgres:15.1
alias: postgres # 可选,但推荐明确指定别名
variables:
POSTGRES_DB: my_database # 数据库名称
POSTGRES_USER: my_user # 数据库用户
POSTGRES_PASSWORD: my_secret_password # ⚠️ 必须设置!
# 如果需要,可以设置其他变量,如 POSTGRES_HOST_AUTH_METHOD: trust
variables:
# 可以在这里定义应用连接数据库所需的变量
DB_HOST: postgres # 对应服务别名
DB_PORT: 5432
DB_NAME: my_database
DB_USER: my_user
DB_PASSWORD: my_secret_password
before_script:
- python3.11 --version
- pip3.11 --version
- echo "hello world"
build-python:
stage: build
script:
- echo "this is test job"
- cd backend
- pip3.11 install virtualenv
- virtualenv venv
- source venv/bin/activate
- pip3.11 install -r requirements.txt
- echo "ended building python test job"
# 确保在运行数据库操作前,数据库服务已完全启动
- sleep 5 # 给予服务一些时间启动
- alembic revision --autogenerate -m "migrating"
- alembic upgrade head注意事项:
GitLab Runner为每个服务容器创建一个或多个主机名别名,以便作业容器可以访问它们。默认情况下,服务的主机名别名是根据其镜像名称生成的:
对于postgres:15.1这样的镜像,默认别名就是postgres。因此,在应用程序中,应使用DB_HOST=postgres来连接数据库服务。
示例:DATABASE_URL的构建
在Python项目中,如果使用SQLAlchemy和Alembic,通常会通过环境变量构建数据库连接字符串。
# env.py (Alembic environment script)
import os
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
# ... 其他Alembic配置 ...
# 获取数据库连接URL
DATABASE_URL = os.environ.get('DATABASE_URL', 'postgresql+psycopg://user:pass@localhost/dbname')
# 如果 DATABASE_URL 未在环境变量中设置,则通过单独的环境变量构建
if not os.environ.get('DATABASE_URL'):
DB_USER = os.environ.get('DB_USER', 'my_user')
DB_PASSWORD = os.environ.get('DB_PASSWORD', 'my_secret_password')
DB_HOST = os.environ.get('DB_HOST', 'localhost')
DB_PORT = os.environ.get('DB_PORT', '5432')
DB_NAME = os.environ.get('DB_NAME', 'my_database')
DATABASE_URL = f'postgresql+psycopg://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}'
config.set_main_option('sqlalchemy.url', DATABASE_URL)
# ... 其他Alembic代码 ...在上述代码中,DB_HOST将从GitLab CI/CD的variables中获取postgres,确保应用程序能够正确解析到服务容器。
在GitLab CI/CD中使用Docker Executor连接PostgreSQL服务,关键在于以下几点:
遵循这些实践,可以显著提高在GitLab CI/CD流水线中集成和连接PostgreSQL服务的成功率和稳定性。
以上就是在GitLab CI/CD中连接PostgreSQL服务的实践指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号