You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:43:01