如何在Dockerfile CMD命令中传递含空格的JVM属性参数
问题根源
启动失败本质是shell变量无引号展开时的分词问题:未加引号的$JAVA_OPTS在shell执行阶段会被按空格拆分为多个独立参数,原本完整的Kafka SASL配置参数会被切割成多个不合法的JVM参数,导致启动异常。
解决方案
方案1:保留环境变量动态传参能力(推荐)
修改CMD指令,给$JAVA_OPTS包裹双引号即可,注意JSON数组内的双引号需要用反斜杠转义:CMD ["sh", "-c", "java \"$JAVA_OPTS\" -jar xxx.jar"]
如果是在Dockerfile中直接定义该参数到ENV,写法如下即可,ENV会自动保留参数内的空格:
ENV JAVA_OPTS="-Dproducer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=xxx password=pass;" CMD ["sh", "-c", "java \"$JAVA_OPTS\" -jar xxx.jar"]
运行容器时动态传参也遵循同样规则,给环境变量值外层加双引号即可:docker run -e JAVA_OPTS="-Dproducer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=xxx password=pass;" 你的镜像名
方案2:参数固定时用exec形式CMD
如果不需要动态调整JVM参数,可以直接用exec形式的CMD,不需要shell解析,参数空格会被完整保留:CMD ["java", "-Dproducer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=xxx password=pass;", "-jar", "xxx.jar"]
内容的提问来源于stack exchange,提问作者H.Ç.T
相关产品推荐
相关产品推荐

