PostgreSQL Docker容器创建后自动停止,需手动启动问题求助
PostgreSQL Docker容器创建后无法自动保持运行的解决方法
问题根源
- 交互式终端参数误用:脚本中使用
docker exec -it执行命令,-it是为交互式终端设计的参数,在非交互式脚本环境下使用会导致终端分配异常,可能触发容器意外退出。 - 固定等待时间不可靠:
sleep 30无法精准匹配PostgreSQL的初始化时长,若容器初始化耗时超过30秒,后续命令执行失败会干扰容器状态;若耗时不足,也会造成不必要的等待。 - 重启后无状态验证:直接执行
docker restart后未确认容器是否正常启动,无法及时发现重启失败的情况。
修改后的脚本
#!/bin/bash set -e # 启动PostgreSQL容器 docker run -d --name postgresql \ --network mynet \ --ip 172.18.0.33 \ -e POSTGRES_PASSWORD=mysecretpassword \ -v postgres_data:/var/lib/postgresql/data \ postgres:14 # 等待PostgreSQL服务就绪(替代固定sleep) echo "等待PostgreSQL容器初始化完成..." until docker exec postgresql pg_isready -U postgres; do sleep 2 done # 创建odoo用户和数据库(移除-it参数) docker exec postgresql psql -U postgres -c "CREATE USER odoo WITH PASSWORD 'mypassword' CREATEDB;" # 修改PostgreSQL配置(移除-it参数) docker exec postgresql sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/postgresql/data/postgresql.conf docker exec postgresql bash -c "echo 'host all all 172.18.0.0/16 password' >> /var/lib/postgresql/data/pg_hba.conf" # 重启容器并确认启动状态 docker restart postgresql echo "等待PostgreSQL容器重启完成..." until docker exec postgresql pg_isready -U postgres; do sleep 2 done echo "PostgreSQL安装配置完成,容器已正常运行。" exit 0
关键修改说明
- 移除
docker exec的-it参数:非交互式脚本环境下执行容器内命令无需分配终端,避免终端相关的异常问题。 - 用
pg_isready替代固定sleep:通过PostgreSQL自带的pg_isready命令轮询检查服务状态,确保容器完全初始化后再执行后续操作,可靠性更高。 - 增加重启后的状态验证:容器重启后再次通过
pg_isready确认服务正常启动,保证脚本执行完成后容器处于运行状态。
验证方法
脚本执行完成后,运行docker ps命令,查看postgresql容器的状态应为Up,无需手动启动。
内容的提问来源于stack exchange,提问作者Neural
相关产品推荐
相关产品推荐

