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

PostgreSQL Docker容器创建后自动停止,需手动启动问题求助

PostgreSQL Docker容器创建后无法自动保持运行的解决方法

问题根源

  1. 交互式终端参数误用:脚本中使用docker exec -it执行命令,-it是为交互式终端设计的参数,在非交互式脚本环境下使用会导致终端分配异常,可能触发容器意外退出。
  2. 固定等待时间不可靠:sleep 30无法精准匹配PostgreSQL的初始化时长,若容器初始化耗时超过30秒,后续命令执行失败会干扰容器状态;若耗时不足,也会造成不必要的等待。
  3. 重启后无状态验证:直接执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:45:54