首页 > 解决方案 > Docker CMD + ENTRYPOINT 与命令行行为不匹配

问题描述

我正在尝试基于 distroless java 映像构建一个 vertx docker 环境。当我运行 docker 容器时,它找不到我要执行的类。

但是,当我在容器中运行命令时,它工作得很好。

这是我的 Dockerfile

FROM gcr.io/distroless/java:debug
ADD vert.x-3.7.0.tar.gz /usr/

ENTRYPOINT ["java","-cp", "'/usr/vertx/lib/*'", "io.vertx.core.Launcher", "version"]
CMD ["-start"]

当我运行容器时,我收到以下错误:

Error: Could not find or load main class io.vertx.core.Launcher

所以我使用以下命令运行图像:

docker run --entrypoint=sh -ti <image_name>

这给出了一个busybox shell。然后我在命令行输入以下内容:

java -cp '/usr/vertx/lib/*' io.vertx.core.Launcher version

它工作得很好,给了我以下输出

Apr 07, 2019 7:20:18 PM io.vertx.core.impl.launcher.commands.VersionCommand
INFO: 3.7.0

我期望 ENTRYPOINT + CMD 组合具有相同的行为。我似乎无法弄清楚为什么该组合不起作用。

标签: javadockervert.x

解决方案


您的Dockerfile. 你有:

ENTRYPOINT ["java","-cp", "'/usr/vertx/lib/*'", "io.vertx.core.Launcher", "version"]

第三个参数中的引号太多。你有:

"'/usr/vertx/lib/*'"

你要:

"/usr/vertx/lib/*"

在您的 currentDockerfile中,选项的参数-cp是文字值'/usr/vertx/lib/*',包括单引号。这当然不匹配任何文件系统路径。


推荐阅读