【问题标题】: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文件复制到容器中时去掉版本号

标签: java spring docker spring-boot


【解决方案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...”
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 2021-09-11
  • 1970-01-01
  • 2021-03-05
  • 2014-07-26
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多