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

Docker Compose中psql连接PostGIS容器失败的问题求助

Docker Compose中psql连接PostGIS容器失败的问题求助

问题描述

我想通过Docker Compose运行带PostGIS扩展的本地Postgres数据库,自动导入Shapefile而不用手动操作。我已经写了docker-compose.yml:

  • postgis服务用官方PostGIS镜像,端口映射5432,测试过能正常连接;
  • import-shapefile服务用postgres镜像,安装PostGIS工具后,用shp2pgsql转换Shapefile,再通过psql导入到PostGIS容器的数据库里。

我的docker-compose.yml内容如下:

services:
  postgis:
    image: postgis/postgis
    restart: always
    env_file:
      - .env
    ports:
      - 5432:5432
    platform: linux/amd64
    volumes:
      - ./dataset:/dataset

  import-shapefile:
    image: postgres
    depends_on:
      - postgis
    volumes:
      - ./dataset:/dataset
    entrypoint: sh
    command: -c "apt-get update && apt-get install -y postgis && shp2pgsql -s 4326 -I -D -W UTF-8 dataset/my_shapefile.shp my_table | psql -U username -d my_db"
    environment:
      - POSTGRES_USER
      - POSTGRES_DB

但import-shapefile容器日志报错:

sql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
Is the server running locally and accepting connections on that socket?

有没有人知道怎么在docker-compose.yml里解决这个问题?


解决方案

这个问题主要有两个核心原因,咱们一步步来解决:

  1. 指定PostgreSQL服务的主机地址
    你的psql命令默认会尝试连接本地的Unix socket,但PostGIS数据库是在另一个独立容器里的,所以必须明确指定数据库的主机为postgis(也就是docker-compose里的服务名,Docker会自动解析这个域名到对应容器的IP)。另外如果你的.env文件里配置了POSTGRES_PASSWORD,也要把它传递给import-shapefile服务,不然psql会因为缺少密码连接失败。

    修改后的import-shapefile配置:

    • 在psql命令里加上-h postgis -p 5432指定远程主机和端口;
    • 把POSTGRES_PASSWORD加入环境变量,让psql自动读取。
  2. 等待PostGIS服务完全就绪
    depends_on只是保证postgis容器启动了,但PostgreSQL服务可能还在初始化(比如创建数据库、加载扩展),这时候直接跑psql肯定连不上。可以加一段简单的shell循环,等数据库能正常连接后再执行导入操作。

最终修改后的docker-compose.yml示例

services:
  postgis:
    image: postgis/postgis
    restart: always
    env_file:
      - .env
    ports:
      - 5432:5432
    platform: linux/amd64
    volumes:
      - ./dataset:/dataset

  import-shapefile:
    image: postgres
    depends_on:
      - postgis
    volumes:
      - ./dataset:/dataset
    entrypoint: sh
    command: -c "apt-get update && apt-get install -y postgis && until psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h postgis -p 5432 -c '\q'; do echo 等待数据库就绪...; sleep 2; done; shp2pgsql -s 4326 -I -D -W UTF-8 dataset/my_shapefile.shp my_table | psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h postgis -p 5432"
    environment:
      - POSTGRES_USER
      - POSTGRES_DB
      - POSTGRES_PASSWORD

这样修改后,import-shapefile容器会先等待PostGIS数据库完全就绪,再执行Shapefile的导入操作,应该就能解决连接失败的问题了。

备注:内容来源于stack exchange,提问作者elhjenson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:47:59