Docker run -e 参数需用单引号包裹含空格、感叹号、美元符等特殊字符的值,防止Shell错误解析;双引号可能导致$和!被展开或替换,不加引号则空格会截断参数。
变量值里有空格、感叹号、美元符这些字符时,不加引号容易被 shell 错误解析,导致注入失败或值被截断。关键不是“能不能用”,而是“怎么用才安全可靠”。
docker run -e 中必须用单引号包裹
Shell 会对双引号内的 $ 和 ! 做展开或历史命令替换,而单引号完全禁用所有特殊含义:
-
正确写法(推荐):
docker run -e 'API_KEY=abc!def@2026' -e 'DB_URL=postgres://user:pass with space@db:5432/app' nginx -
错误写法:
docker run -e "API_KEY=abc!def"——!可能触发 bash 历史扩展,报错或赋值异常 -
也错误:
docker run -e DB_URL=postgres://user:pass with space@db...—— 空格让 Shell 把它当多个参数,命令直接失败
docker-compose.yml 中的 environment 字段要加引号
YAML 解析器本身不处理 Shell 展开,但值含空格或冒号时,YAML 要求引号才能识别为字符串:
-
带空格或特殊符号的值必须加双引号:
- DB_URL="postgres://user:my password@db:5432/app" -
含 $ 的也要引起来,否则可能被 YAML 当作变量引用(虽然 Compose 不会解析它,但语法不合规易出错):
- SECRET="token$2a$12$abc" - 纯字母数字、无空格无符号的值可不加引号,如
- LOG_LEVEL=info
env_file 文件中一般不加引号,但值含空格需转义或换行
.env 文件格式是纯 KEY=VALUE,不支持引号语法。若值含空格,标准做法是用反斜杠换行续写:
-
正确(换行续写):
MESSAGE=Hello \ World(注意:反斜杠后必须紧跟换行,且下一行顶格) -
更稳妥的做法是避免在 .env 中放含空格的敏感值 —— 改用
${HOST_VAR}引用宿主机变量,由宿主机 shell 处理引号逻辑 - 如果非得写进 .env,且工具链支持(如较新版本 docker-compose),可尝试双引号,但兼容性差,不推荐
宿主机变量引用 ${VAR} 时,确保宿主机已正确导出带引号的值
这种方式把解析压力交给宿主机 shell,更可控:
- 先在终端执行:
export DB_PASSWORD='my!secret@2026'(单引号) - 再在 docker-compose.yml 中写:
- DB_PASSWORD=${DB_PASSWORD} - Compose 会原样取值注入,不再经过二次 shell 解析


















