Docker内联Shell脚本无法打印环境变量值问题
问题原因
核心问题是变量替换时机不对:在定义InlineShell变量时,本地shell会先解析其中的$SAMPLE_VAL,但你的本地环境并没有设置这个变量,所以它被替换成了空字符串。最终传到Docker容器里的脚本实际是echo "",自然打印不出值;而容器env能看到变量,是因为-e参数确实把变量注入到了容器环境中。
解决办法
以下是几种可行的修复方式:
方法1:转义变量符号$
在Here Document里给$SAMPLE_VAL加反斜杠转义,让本地shell不解析这个变量,把它原封不动传给容器里的bash:
InlineShell=$(cat <<<-EOF echo "printing values" echo "\$SAMPLE_VAL" echo "end of printing values" echo "printing env vars" env EOF ) docker run -e SAMPLE_VAL="Sample Value" <image> /bin/bash -c "$InlineShell"
注意最后要给$InlineShell套双引号,避免脚本内容被空格拆分导致执行异常。
方法2:用单引号包裹Here Document的分界符
把EOF用单引号括起来,整个Here Document里的内容会被当作纯字符串,本地shell不会做任何变量替换:
InlineShell=$(cat <<-'EOF' echo "printing values" echo "$SAMPLE_VAL" echo "end of printing values" echo "printing env vars" env EOF ) docker run -e SAMPLE_VAL="Sample Value" <image> /bin/bash -c "$InlineShell"
方法3:直接传递脚本字符串
跳过变量存储步骤,直接把脚本内容作为字符串传给bash -c,变量只会在容器里的shell中被解析:
docker run -e SAMPLE_VAL="Sample Value" <image> /bin/bash -c 'echo "printing values"; echo "$SAMPLE_VAL"; echo "end of printing values"; echo "printing env vars"; env'
内容的提问来源于stack exchange,提问作者gaby7457
相关产品推荐
相关产品推荐

