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里解决这个问题?
解决方案
这个问题主要有两个核心原因,咱们一步步来解决:
指定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自动读取。
- 在
等待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
相关产品推荐
相关产品推荐

