Docker部署PostgreSQL导入数据后容器停止,如何使其持续运行?
解决PostgreSQL容器导入数据后停止的问题
问题分析
容器在数据导入完成后停止,核心原因通常有两个:
- 初始化脚本未处理重复执行场景(比如容器重启时),
createdb命令因数据库已存在报错,触发set -e终止流程 PGDATA目录权限不符合PostgreSQL运行要求,导致主进程启动失败
修复步骤
1. 修改初始化脚本,避免重复创建数据库
更新entrypoint2.sh,先判断目标数据库是否存在,仅在不存在时执行创建操作,避免报错终止流程:
#!/bin/bash set -e # 检查opr数据库是否存在,不存在则创建 psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'opr'" | grep -q 1 || createdb opr # 导入备份数据 pg_restore -U postgres -d opr /opr.dump
2. 完善Dockerfile配置
添加目录权限设置和脚本可执行权限配置,确保PostgreSQL进程能正常运行:
FROM postgres:14.10 # 设置环境变量 ENV PGDATA=/var/pgdata ENV POSTGRES_USER=postgres ENV POSTGRES_PASSWORD=admin ENV POSTGRES_HOST_AUTH_METHOD=trust # 创建PGDATA目录并设置正确权限 RUN mkdir -p /var/pgdata && chown -R postgres:postgres /var/pgdata # 复制备份文件和初始化脚本 COPY opr.dump /opr.dump COPY entrypoint2.sh /docker-entrypoint-initdb.d/entrypoint2.sh # 赋予初始化脚本执行权限 RUN chmod +x /docker-entrypoint-initdb.d/entrypoint2.sh ENTRYPOINT ["docker-entrypoint.sh"] CMD ["postgres"]
3. 验证容器运行
构建镜像并启动容器:
docker build -t postgres-opr . docker run -d --name postgres-opr-container postgres-opr
通过日志确认PostgreSQL主进程正常启动:
docker logs postgres-opr-container
正常启动会出现类似日志:
... PostgreSQL init process complete; ready for start up. 202X-XX-XX XX:XX:XX.XXX UTC [1] LOG: starting PostgreSQL 14.10 on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit 202X-XX-XX XX:XX:XX.XXX UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 202X-XX-XX XX:XX:XX.XXX UTC [1] LOG: listening on IPv6 address "::", port 5432 202X-XX-XX XX:XX:XX.XXX UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 202X-XX-XX XX:XX:XX.XXX UTC [1] LOG: database system is ready to accept connections
关键原理
PostgreSQL官方镜像的docker-entrypoint.sh会在首次初始化时执行docker-entrypoint-initdb.d目录下的脚本,执行完成后自动启动PostgreSQL主进程。如果初始化脚本报错终止,或者主进程因权限问题无法启动,容器就会停止运行。
内容的提问来源于stack exchange,提问作者Petru Scurtu
相关产品推荐
相关产品推荐

