You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

CircleCI配置PostgreSQL容器测试时Python无法连接数据库

解决CircleCI中Python无法连接PostgreSQL容器的问题

嘿,我之前在CircleCI上折腾Python+PostgreSQL测试的时候,也碰到过和你一模一样的问题!咱们来一步步把它搞定。

问题复盘

你已经在config.yml里配置了PostgreSQL服务容器,指定了测试用户和数据库,但运行测试时Python程序抛出了这个扎心的错误:

psycopg2.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

而且你查了主容器的/var/run目录,确实找不到postgresql文件夹——这其实是Docker容器隔离特性导致的典型问题。

核心原因解析

CircleCI里的PostgreSQL是作为独立的Docker容器运行的,和你的Python主容器不在同一个网络空间里。PostgreSQL的Unix套接字文件只存在于它自己的容器内部,你的Python容器根本访问不到这个文件,所以用本地套接字连接肯定会失败,必须改用TCP网络连接才行。

具体解决方案

1. 修改Python项目的数据库连接配置

首先要确保你的数据库配置(比如Django的settings.py,或者其他框架的配置文件)使用TCP连接,参数要和你给PostgreSQL容器设置的环境变量对应上:

# 以Django为例,其他Python框架的配置逻辑类似
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'circle_test',  # 和config.yml里的POSTGRES_DB保持一致
        'USER': 'circleci',     # 和POSTGRES_USER保持一致
        'PASSWORD': '',         # 因为设置了POSTGRES_HOST_AUTH_METHOD: trust,不需要密码
        'HOST': 'localhost',    # CircleCI会自动把服务容器的端口映射到主容器的localhost
        'PORT': '5432',         # PostgreSQL默认端口
    }
}

2. 等PostgreSQL完全启动再跑测试

有时候测试启动得太快,PostgreSQL容器还没完成初始化就开始尝试连接,也会失败。可以在测试步骤前加一个等待脚本,确保数据库服务就绪:
config.ymlsteps中,Running tests之前添加这段配置:

- run:
    name: Wait for PostgreSQL to be ready
    command: |
      sudo apt-get update && sudo apt-get install -y netcat
      until nc -z localhost 5432; do
        echo "Waiting for PostgreSQL to start..."
        sleep 2
      done

这个脚本会循环检查5432端口是否开放,直到PostgreSQL服务完全启动后再继续。

3. 确认容器配置没问题

你的config.yml里PostgreSQL的环境变量配置是正确的:

- image: circleci/postgres:9.6
  environment:
    POSTGRES_USER: circleci
    POSTGRES_DB: circle_test
    POSTGRES_HOST_AUTH_METHOD: trust

CircleCI会自动处理容器间的网络映射,主容器通过localhost:5432就能正常访问到PostgreSQL服务。

可选调试步骤

如果修改后还是有问题,可以在测试前加一个简单的连接测试,验证数据库是否能正常访问:

- run:
    name: Test PostgreSQL connection
    command: |
      . venv/bin/activate
      python3 -c "import psycopg2; conn = psycopg2.connect(dbname='circle_test', user='circleci', host='localhost', port='5432'); print('Database connection successful!'); conn.close()"

内容的提问来源于stack exchange,提问作者DeltaG

火山引擎 最新活动