You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含空格的Docker环境变量传递问题:JVM参数传入Jar失败求助

解决Docker传递带空格的JVM参数问题

你的问题核心是带空格的环境变量被shell错误拆分,导致JVM参数解析异常,我来帮你一步步解决:

问题根源分析

你当前Dockerfile里的CMD是shell模式:

CMD java -jar -DinstallationDate=$INSTALLATION_DATE /test.jar

当传递INSTALLATION_DATE="03.05.10.2019 15:00:00"时,容器内的shell会把变量展开成带空格的字符串,然后将整个命令拆分成:

java -jar -DinstallationDate=03.05.10.2019 15:00:00 /test.jar

这时候Java会把15:00:00误认为是要执行的Jar文件路径,自然就报出"无法访问jarfile"的错误。


解决方案1:修改Dockerfile(推荐)

把CMD改成exec数组形式+shell解析,确保带空格的变量被作为一个整体传递:

FROM openjdk:9-jre
COPY test.jar /
CMD ["sh", "-c", "java -jar -DinstallationDate=\"${INSTALLATION_DATE}\" /test.jar"]

这里用sh -c包裹命令,同时用双引号把${INSTALLATION_DATE}括起来,容器内的shell就会将整个变量值作为单个参数传递给Java。

之后用你原来的运行命令即可:

docker run -e INSTALLATION_DATE="03.05.10.2019 15:00:00" space

解决方案2:不修改Dockerfile,直接覆盖运行命令

如果不想改动Dockerfile,可以在docker run时直接指定完整执行命令,用单引号包裹避免本地shell解析变量:

docker run -e INSTALLATION_DATE="03.05.10.2019 15:00:00" space sh -c 'java -jar -DinstallationDate="$INSTALLATION_DATE" /test.jar'

单引号会让容器内的shell处理$INSTALLATION_DATE的展开,双引号则确保变量值不会被空格拆分。


为什么之前的尝试无效?

  • JSON数组形式的-e:docker run -e ["INSTALLATION_DATE","03.05.10.2019 15:00:00"]是Docker Compose的写法,docker run不支持这种格式,所以环境变量根本没正确设置,导致参数为空。
  • 反斜杠转义空格:虽然本地shell会把转义后的空格传递给Docker,但容器内的shell在展开$INSTALLATION_DATE时,因为没有引号包裹,依然会把空格作为参数分隔符,导致参数拆分。

内容的提问来源于stack exchange,提问作者Alexander Rumanovsk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:21:47