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

如何在Shell脚本中合并docker exec命令自动创建PostgreSQL数据库

实现方案

最简可用脚本

直接按下方写法编写脚本即可自动完成容器启动、建库的全流程:

#!/bin/bash
# 启动PostgreSQL容器
winpty docker run -p 8005:5432 --name postgres_db -e POSTGRES_PASSWORD=password -d postgres
# 等待服务完全启动
sleep 5
# 直接执行建库语句,无需进入交互环境
winpty docker exec postgres_db psql -U postgres -c "create database test;"

原写法错误原因

你之前的脚本错误是将psql的-c参数放到了bash的调用范围外,混淆了不同命令的参数边界。实际上psql本身就支持通过-c参数直接执行单条SQL,不需要进入交互模式,也不需要额外调用bash层,直接在docker exec中调用psql传参即可。

多SQL执行场景

如果需要一次性执行多条SQL语句,可以使用Here Document的写法,注意去掉docker exec的-t参数:

winpty docker exec -i postgres_db psql -U postgres <<EOF
create database test;
create user test_user with encrypted password 'test123';
grant all privileges on database test to test_user;
EOF

稳定性优化(可选)

固定sleep时间可能因为机器性能差异导致服务未就绪就执行SQL报错,可以用pg_isready工具做健康检测,等待服务完全就绪后再执行后续操作:

#!/bin/bash
winpty docker run -p 8005:5432 --name postgres_db -e POSTGRES_PASSWORD=password -d postgres

# 循环检测服务状态
until winpty docker exec postgres_db pg_isready -U postgres
do
  echo "等待PostgreSQL服务启动..."
  sleep 1
done

# 服务就绪后执行建库
winpty docker exec postgres_db psql -U postgres -c "create database test;"

内容的提问来源于stack exchange,提问作者user17219965

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:45:04