如何在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
相关产品推荐
相关产品推荐

