繁体   English   中英

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

[英]Docker CMD + ENTRYPOINT not matching command line behavior

我正在尝试基于一个发行版的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组合具有相同的行为。 我只是似乎无法弄清楚为什么该组合无法正常工作。

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

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

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

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

你要:

"/usr/vertx/lib/*"

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

最终解决方案是使用以下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图像。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM