使用oc rsh访问OpenShift容器时如何将环境变量作为命令参数传递
问题根因
- 直接通过
oc rsh <容器名> <命令>的形式执行命令时,非交互式调用默认不会触发容器内 shell 的变量展开逻辑,你传入的$MONGODB_*变量不会被容器识别解析 - 如果你在 Linux/macOS 环境下执行命令,本地 shell 会先把
$开头的变量替换为本地环境的对应值,本地没有这些变量就会导致传入容器的参数异常(你在 Windows cmd 环境下执行不会有本地解析的问题,所以测试返回的是原始的$MONGODB_PASSWORD字符串)
可行解决方案
方案1(最通用,推荐)
将需要在容器内执行的整段命令作为参数传给sh -c,并用单引号包裹整段命令,完全避免本地 shell 提前解析变量,同时触发容器内的变量解析逻辑。
测试命令验证写法
oc rsh mon-rs-nr-0 sh -c 'echo $MONGODB_PASSWORD'
执行上述命令即可正常返回容器内的密码值。
对应 mongodump 命令写法
oc rsh mon-rs-nr-0 sh -c 'mongodump --host=rs/mon-rs-nr-0.mon-rs-nr.xxx.svc.cluster.local,mon-rs-nr-1.xxx.svc.cluster.local,mon-rs-nr-2.mon-rs-nr.xxx.svc.cluster.local --username=$MONGODB_USER --password=$MONGODB_PASSWORD --authenticationDatabase=$MONGODB_DATABASE'
方案2(适用于命令内包含单引号的场景)
如果你的执行逻辑里本身包含单引号,可以改用双引号包裹命令,同时给所有$符号添加转义符,避免本地 shell 提前解析:
oc rsh mon-rs-nr-0 sh -c "mongodump --host=rs/mon-rs-nr-0.mon-rs-nr.xxx.svc.cluster.local,mon-rs-nr-1.xxx.svc.cluster.local,mon-rs-nr-2.mon-rs-nr.xxx.svc.cluster.local --username=\$MONGODB_USER --password=\$MONGODB_PASSWORD --authenticationDatabase=\$MONGODB_DATABASE"
补充说明
如果容器内置的shell是bash,可以将上述命令中的sh替换为bash,兼容性更好。
内容的提问来源于stack exchange,提问作者xbubus
相关产品推荐
相关产品推荐

