Docker Compose指令中Bash短路逻辑失效问题求助
问题解决:Docker Compose中Bash短路逻辑不生效的处理
问题根源
Docker Compose的command字段默认会将命令拆分为数组形式直接执行,不会启动Shell解析||这类Shell特有的逻辑运算符,因此你的短路逻辑无法被触发。必须显式调用Shell来包裹整个命令串,让Shell处理这些语法。
修正后的配置
修改psql服务的command字段,用sh -c包裹完整命令,并修正YAML中的转义问题:
psql: image: alpine/psql:16.3 depends_on: db: condition: service_healthy environment: - PGPASSWORD=password command: sh -c "psql -h db -U postgres -c 'select 1' -d 'my_db' &> /dev/null || psql -d 'postgres' -h db -U postgres -tc 'create database my_db'"
关键修改点
- 用
sh -c启动Alpine镜像中的Shell,确保||逻辑被正确解析执行 - 移除YAML中不必要的HTML转义
&>,直接使用Shell支持的&>进行标准输出和错误输出的重定向(也可以用兼容性更强的>/dev/null 2>&1替代) - 将整个命令串作为一个字符串传递给
sh -c,保证Shell能完整解析逻辑
验证逻辑
Shell会先执行左侧的psql连接测试命令:
- 如果
my_db存在,命令返回0,短路逻辑不触发右侧命令 - 如果
my_db不存在,命令返回非0,自动执行右侧的数据库创建命令
内容的提问来源于stack exchange,提问作者Inder
相关产品推荐
相关产品推荐

