Postgres Docker容器启动失败:psql连接.s.PGSQL.5432 socket失败
核心故障原因
官方PostgreSQL镜像的默认ENTRYPOINT会自动完成数据库初始化、启动PostgreSQL服务、执行docker-entrypoint-initdb.d目录下脚本的全流程。你直接覆盖了默认ENTRYPOINT为自定义的1-restore.sh,脚本运行时PostgreSQL服务尚未启动,因此psql无法找到连接套接字触发报错。
可行解决方案
- 移除自定义ENTRYPOINT配置,将初始化脚本直接放入
docker-entrypoint-initdb.d目录,官方镜像会在PostgreSQL服务完全启动后自动执行该目录下的可执行.sh脚本 - 初始化脚本开头可增加3-5秒的等待,确保服务完全就绪后再执行psql命令,避免偶发的连接失败
- 修正脚本中语法错误:末尾输出行
echo ""TestMessage">>test.txt存在引号不匹配问题,改为echo "TestMessage">>test.txt即可
修正后的配置示例
Dockerfile
FROM postgres:latest ## 安装依赖工具 RUN apt-get update -y && \ apt-get install -y build-essential libfuse-dev libcurl4-openssl-dev libxml2-dev pkg-config libssl-dev mime-support automake libtool wget tar git unzip lsb-release zip vim ## 安装S3 Fuse RUN rm -rf /usr/src/s3fs-fuse && \ git clone https://github.com/s3fs-fuse/s3fs-fuse/ /usr/src/s3fs-fuse && \ cd /usr/src/s3fs-fuse && \ ./autogen.sh && ./configure && make && make install ## 创建数据目录 RUN mkdir -p /data/out ## 将初始化脚本放入官方指定的自动执行目录 ADD docker-entrypoint-initdb.d/1-restore.sh /docker-entrypoint-initdb.d/1-restore.sh RUN chmod 755 /docker-entrypoint-initdb.d/1-restore.sh
1-restore.sh 脚本
#!/bin/bash set -e # 等待PostgreSQL服务完全启动 sleep 3 # 执行dump导入 psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < "$DUMP_FILE" # 导出表为JSON psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL SET client_encoding TO 'UTF8'; \t \a \o $OUT_FOLDER/export_json.sql; SELECT '\o $OUT_FOLDER/' || table_name || '.json;' || E'\n' || 'SELECT row_to_json(r) FROM "' || table_name || '" AS r;' FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name; \i $OUT_FOLDER/export_json.sql; EOSQL rm "$OUT_FOLDER/export_json.sql" echo "TestMessage">>test.txt
额外排查点
- 运行容器时需确保传入
POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB、DUMP_FILE、OUT_FOLDER所需的所有环境变量 - 若DUMP_FILE为本地文件,需要通过Docker挂载将文件映射到容器内对应路径
内容的提问来源于stack exchange,提问作者Rajesh Kumar Dash
相关产品推荐
相关产品推荐

