为啥 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 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章