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