如何在docker run命令的-e参数中传入列表类型环境变量?
Docker run 传入数组类型环境变量的解决方案
报错根因
你遇到的invalid reference format报错是Shell的花括号扩展特性导致的:
- 不带引号包裹的
{a,b,c}结构会被Bash(Amazon Linux2默认Shell)自动拆分为多个独立参数 - 命令1的
DDL_AUTO={update,create,validate}会被扩展为DDL_AUTO=updateDDL_AUTO=createDDL_AUTO=validate三个参数 - 命令2加空格后,Shell会把空格分割的内容识别为独立参数
- 上述扩展后的多余参数会被Docker解析为镜像名,不符合镜像名小写规则因此报错
可行的传参方案
针对Spring Boot项目,有两种无需修改业务代码的传参方式:
方案1:逗号分隔字符串(最简便)
Spring Boot原生支持将逗号分隔的字符串自动转换为数组/List类型的配置项,直接用引号包裹整个环境变量键值对即可:
docker run -itd --name example_container -e "DDL_AUTO=update,create,validate" -p 80:8080 example_image
方案2:标准JSON数组格式
如果必须使用数组结构的写法,需要用单引号包裹标准JSON数组,避免Shell解析花括号和内部引号:
docker run -itd --name example_container -e 'DDL_AUTO=["update","create","validate"]' -p 80:8080 example_image
注:该方式要求Spring Boot版本支持JSON格式的环境变量注入,Spring Boot 2.0+均默认支持该特性。
内容的提问来源于stack exchange,提问作者Jun
相关产品推荐
相关产品推荐

