docker-compose使用bash变量出现variable is not set错误的解决咨询
Docker Compose Command 变量解析错误的解决办法
你的问题核心是Docker Compose会自动解析YAML中的$符号,把它当成环境变量进行插值,导致脚本里的$RANDOM、$max等变量被提前解析,而非留给容器内的shell处理;另外原命令还缺少一个闭合的单引号,也会引发语法错误。以下是几种解决方法:
方法1:转义$符号
在所有需要留给shell处理的$前添加反斜杠\,阻止Docker Compose解析这些变量,同时补全闭合的单引号:
version: "3.9" ... command: "/bin/sh -c 'max=20; min=10; trap exit TERM; while :; do echo test; sleep \$(($RANDOM%($max-$min+1)+$min)); done'" ...
方法2:使用数组形式的Command
Docker Compose对数组形式的command不会进行变量插值,数组元素会直接作为参数传递给shell,这样可以避免变量被提前解析:
version: "3.9" ... command: - /bin/sh - -c - max=20; min=10; trap exit TERM; while :; do echo test; sleep $(($RANDOM%($max-$min+1)+$min)); done ...
方法3:使用外部脚本文件
把循环逻辑写入单独的shell脚本,挂载到容器中执行,这种方式更易维护,也彻底避免变量解析冲突:
- 创建
test-loop.sh脚本:
#!/bin/sh max=20 min=10 trap exit TERM while :; do echo test sleep $(($RANDOM%($max-$min+1)+$min)) done
- 给脚本添加执行权限:
chmod +x test-loop.sh
- 在Docker Compose中配置挂载和执行命令:
version: "3.9" ... services: tool: ... command: /app/test-loop.sh volumes: - ./test-loop.sh:/app/test-loop.sh:ro ...
内容的提问来源于stack exchange,提问作者Jeanluca Scaljeri
相关产品推荐
相关产品推荐

