Docker run执行单行脚本时使用容器内置环境变量是否可行?
问题结论
你给出的原有命令无法实现预期效果,核心问题是变量展开时机错误。
问题原因
你使用双引号包裹sh -c的脚本内容时,$((ARRAY_INDEX + 1))、${colors[${LINE}]}这类带$的表达式,会在宿主机Shell执行docker命令时就提前展开解析,而非传入容器后由容器内的Shell解析。
宿主机环境不存在你预置在镜像里的ARRAY_INDEX变量,也没有定义colors数组,最终传入容器执行的脚本内容完全不符合预期。
修复方案
你可以任选以下任意一种方法修改命令,即可实现预期逻辑:
- 方案一:改用单引号包裹脚本内容,阻止宿主机提前解析变量
docker run ubuntu:updated sh -c 'colors=(red orange white gray);LINE=$((ARRAY_INDEX + 1));echo ${colors[${LINE}]}'
- 方案二:保留双引号的前提下,给容器内需要解析的变量的
$符号添加转义符
docker run ubuntu:updated sh -c "colors=(red orange white gray);LINE=\$((ARRAY_INDEX + 1));echo \${colors[\${LINE}]}"
额外注意:Shell数组下标默认从0开始,你预置的
ARRAY_INDEX值不能超过2,否则会出现数组越界,最终输出为空。
内容的提问来源于stack exchange,提问作者Prabhat Saxena
相关产品推荐
相关产品推荐

