如何在GitLab CI Job的K8s Runner中正确连接PostgreSQL服务
解决GitLab Runner(K8s环境)连接PostgreSQL服务的问题
核心问题:错误的数据库主机地址
GitLab CI中配置的services在Kubernetes环境下是作为独立Pod运行的,与测试Job Pod处于同一内部网络,但并非本地(127.0.0.1)。你需要使用服务的alias(即你配置的postgresql)作为数据库主机地址,而非127.0.0.1。
修正后的Job配置
test: stage : tests tags : - k8s image : $CI_REGISTRY/devs/$CI_PIPELINE_BASE_IMAGE variables: # 改用服务别名作为主机地址 DATABASE_HOST: "postgresql" HOST_POSTGRES: "postgresql" POSTGRES_DB: "postgres" # 根据自定义PostgreSQL镜像,设置匹配的用户名和密码 POSTGRES_USER: "postgres" POSTGRES_PASSWORD: "your_password_here" services: - name : $CI_REGISTRY/devs/custom-postgres:v1.0.0 alias: postgresql script: - echo "Testing pipeline" - apt-get update && apt-get install -y postgresql-client # 循环等待PostgreSQL服务就绪(避免启动延迟导致连接失败) - until pg_isready --dbname="${POSTGRES_DB}" --username="${POSTGRES_USER}" --host="${HOST_POSTGRES}"; do sleep 1; done - echo "PostgreSQL is ready" # 修复psql命令的空格错误 - PGPASSWORD=${POSTGRES_PASSWORD} psql ${POSTGRES_DB} -U ${POSTGRES_USER} -h ${HOST_POSTGRES} -c "\dt" # 修复gem install的拼写错误 - gem install bundler
关键修正点说明
- 主机地址修正:将
HOST_POSTGRES和DATABASE_HOST的值改为服务别名postgresql,这是GitLab CI服务在内部网络中的可访问域名。 - 补充必要变量:添加
POSTGRES_USER和POSTGRES_PASSWORD,确保与自定义PostgreSQL镜像初始化时的配置一致。 - 等待服务就绪:PostgreSQL启动需要一定时间,直接执行
pg_isready可能因服务未完全启动导致失败,通过循环等待确保服务就绪后再执行后续操作。 - 修复脚本错误:修正
gem intall为gem install,以及psql命令中-h参数后的空格缺失问题。
内容的提问来源于stack exchange,提问作者CodeWeed
相关产品推荐
相关产品推荐

