为啥 jar 执行的通配符在 docker CMD 中不起作用?

Posted

技术标签:

【中文标题】为啥 jar 执行的通配符在 docker CMD 中不起作用?【英文标题】:Why does wildcard for jar execution not work in docker CMD?为什么 jar 执行的通配符在 docker CMD 中不起作用? 【发布时间】:2017-05-16 15:07:54 【问题描述】:

我有一个 Dockerfile 和以下 CMD 来启动我的 Spring Boot 应用程序:

FROM java:8-jre
# ...
CMD ["java", "-jar", "/app/file*.jar"]

当我尝试从创建的图像启动容器时,我得到:

Error: Unable to access jarfile /app/file*.jar

但是当我在启动容器时覆盖 CMD 并在容器中执行命令时一切正常:

docker run -it <imageId> bash
root@<containerId>:/app# java -jar /app/file*.jar
<spring boot app starts...>

是否可以在使用 docker CMD 的 java -jar 命令中使用通配符? 请不要告诉我不要使用通配符。我想使用它的原因;-)

更新 根据答案,我能够修复它:

CMD ["/bin/sh", "-c", "java -jar /app/file*.jar"]

【问题讨论】:

CMD java -jar /app/file*.jar 大致相同,而且更直接一些。 使用通配符的原因是什么? @ThorbjørnRavnAndersen jar 文件名包含版本,我不想每次都调整 Dockerfile 或使用build-arg。通配符似乎是避免两者的简单方法。 将jar文件复制到容器中时去掉版本号 【参考方案1】:

这种星号扩展是由命令行处理器(shell)完成的,您可以通过直接调用 java 来规避它。

与在 Windows 下使用“CMD /C”调用命令的方式非常相似,以获得完整的处理。

改为调用/bin/sh

【讨论】:

另外,您可能需要考虑部署一个启动器脚本来处理所有这些事情以及您的 jar 文件。对于 maven 构建,这通常使用 appassembler-maven-plugin 完成【参考方案2】:

CMD java -jar /app/file*.jar 为我工作

【讨论】:

是的。 CMD java -cp "lib/*" com.mydomain.Main 为我工作。 “docker ps”显示它运行一个shell:“/bin/sh -c 'java -c...”

以上是关于为啥 jar 执行的通配符在 docker CMD 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

我在Eclipse中将一个java项目打包成jar文件后,为啥双击它时没反应?但在eclipse中是可以运行的

使用批处理脚本中的参数调用.jar,并在路径中使用通配符

dockerfile CMD执行多条命令且需要支持环境变量

cmd怎么执行OneClick.jar

学习:jar 的创建,执行,引用;在 cmd 下实践

在cmd中使用指令来执行jar包