构建时向另一个Shell脚本传变量:Docker变量值异常问题
这个问题我碰到过,核心原因是脚本里的变量是延迟解析的——原脚本里的${PREFIX:-'D1'}是在脚本运行时才去读取环境变量,而不是在你复制脚本的阶段就把当前的PREFIX值固化进去。所以当另一个脚本复制完再执行时,如果那个执行环境里没设置PREFIX,自然就会用默认的D1了。给你几个靠谱的解决办法:
方法1:用envsubst替换变量后再复制
envsubst是Linux系统自带的环境变量替换工具,专门干这种事。你可以在复制脚本前,先把原脚本里的变量替换成当前环境的实际值,再保存到目标位置。
假设你的原脚本叫run-deployer.sh,要复制到/target/run-deployer.sh,那负责复制的脚本里可以这么写:
# 将原脚本中的环境变量替换为当前实际值,输出到目标文件 envsubst < run-deployer.sh > /target/run-deployer.sh # 给目标脚本添加执行权限 chmod +x /target/run-deployer.sh # 执行目标脚本 /target/run-deployer.sh
这样处理后,复制到目标位置的脚本会变成这样(假设你当前PREFIX是demo):
PREFIX='demo' echo "PREFIX is demo" docker run -e PREFIX=demo -it tci-deployer /bin/bash
不管后续执行环境有没有设置PREFIX,脚本里的都是你之前导出的demo值,不会再用默认的D1了。
方法2:用sed手动替换变量
如果你的系统没有envsubst(比如某些精简版Linux),可以用sed来手动替换:
# 把原脚本里的${PREFIX:-'D1'}替换成当前环境的PREFIX值 sed "s/\${PREFIX:-'D1'}/$PREFIX/" run-deployer.sh > /target/run-deployer.sh chmod +x /target/run-deployer.sh /target/run-deployer.sh
注意这里一定要用双引号包裹sed的命令,这样$PREFIX才会被解析成当前的实际值,而不是当成字符串处理。如果你的PREFIX值里有特殊字符(比如/、&),可以给sed换个分隔符,比如用#:
sed "s#\${PREFIX:-'D1'}#$PREFIX#" run-deployer.sh > /target/run-deployer.sh
小提醒
如果你的PREFIX可能包含空格或者特殊字符,优先用envsubst,它对环境变量的处理更稳妥,不会因为特殊字符出问题。
内容的提问来源于stack exchange,提问作者Rajiv Rai
相关产品推荐
相关产品推荐

