Docker CMD + ENTRYPOINT与命令行行为不匹配

时间:2019-04-08 03:42:31

标签: java docker vert.x

我正在尝试基于一个发行版的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外壳。然后,我在命令行上输入了以下内容:

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组合具有相同的行为。我只是似乎无法弄清楚为什么该组合无法正常工作。

3 个答案:

答案 0 :(得分:1)

您的Dockerfile中有一个错误。你有:

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

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

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

您要

"/usr/vertx/lib/*"

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

答案 1 :(得分:1)

最终的解决方案是使用以下Dockerfile:

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

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

我删除了:debug只是因为busybox shell仅用于调试。它并没有影响解决方案。

最终大小为222MB,低于大约474MB!我必须进行一些测试,以查看图像的功能是否完整,但是到目前为止,我希望它可以用作缩小的vertx图像。

答案 2 :(得分:0)

非发行版图片的工作方式略有不同。他们希望您的CMD具有[“ yourfile.jar”,“ --param1 = val1”,...]的形式。注意没有“ java”

您可以在非发行版Java映像的构建文件中找到此信息:https://github.com/GoogleContainerTools/distroless/blob/master/java/BUILD#L28