Docker Compose命令中变量赋值不符合预期的原因排查
Docker Compose变量赋值未生效的原因及解决方法
你的docker-compose.yml配置如下:
my-service: image: amazon/aws-cli entrypoint: /bin/sh -c command: > ' a=1899 echo "The value of \"a\" is $a" '
运行后输出为The value of "a" is .,变量a的赋值未按预期生效,原因和解决方法如下:
问题原因
核心问题出在YAML解析规则和sh -c的参数传递逻辑上:
- YAML的
>折叠标记会把块内的换行转换为空格,同时你加的外层单引号会被直接传递给sh -c,最终实际执行的命令等价于:/bin/sh -c '' a=1899 echo "The value of \"a\" is $a" '' sh -c要求第一个参数是要执行的命令字符串,这里第一个参数是空字符串(两个单引号之间无内容),后续的a=1899和echo命令都变成了sh的位置参数。- 此时
a=1899只是echo命令的临时环境变量,而非sh -c启动的shell环境变量,echo中的$a读取的是当前shell的未定义变量,所以输出为空。
解决方法
需要确保所有命令被正确包裹为sh -c的单个命令参数,推荐两种写法:
写法1:用YAML保留换行标记|替代>,去掉外层单引号
my-service: image: amazon/aws-cli entrypoint: /bin/sh -c command: | a=1899 echo "The value of \"a\" is $a"
|标记会保留块内的换行,让sh -c收到完整的多行命令,变量赋值和echo在同一个shell环境中执行。
写法2:将命令合并为单行,用双引号包裹并正确转义
my-service: image: amazon/aws-cli entrypoint: /bin/sh -c command: "a=1899 && echo \"The value of \\\"a\\\" is $a\""
用&&连接命令保证执行顺序,通过转义确保引号和变量被正确解析,避免提前展开。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

