我的 Dockerfile 哪里出错了?

Where am I going wrong with my Dockerfile?

我在包含 Web 应用程序的目录的根目录下创建了一个 Dockerfile。我的 Dockerfile 内容如下:

FROM openjdk:8u282-jre
MAINTAINER me <me@email.com>
COPY target/spring-petclinic-2.2.0.BUILD-SNAPSHOT.jar /
EXPOSE 8080
ENTRYPOINT ["java -jar"]

我正在尝试使用项目目录根目录中的路径从我的本地计算机复制一个 jar 文件 - 将其复制到容器的根目录,公开端口 8080,并使用入口点思考在构建映像后,jar 将 运行 作为使用此入口点的可执行文件。然后我按如下方式构建图像:

docker build -t se441/spring-petclinic:standalone .

将构建命名为 se441/spring-petclinic:standalone,然后我尝试 运行 容器:

docker run -i -t se441/spring-petclinic:standalone

我收到以下错误:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: 
starting container process caused: exec: "java -jar": executable file not found in $PATH: 
unknown.

我编辑了 Dockerfile 使入口点成为 /bin/bash,做了 'ls' 并且 jar 文件肯定在那里。在容器中时,我可以成功 运行 罐子。关于为什么当 building/running 与上面列出的 Dockerfile 一起找不到 jar 文件的任何建议。将不胜感激。谢谢。

变化:

ENTRYPOINT ["java -jar"]

至:

ENTRYPOINT ["java", "-jar"]

exec 语法(使用 json 数组)不执行任何使用 shell 获得的命令行解析,因此它正在寻找文字二进制 java -jar 而不是java 并传递 -jar 参数。您需要将每个参数分隔为另一个数组条目,就像您在命令行中用空格分隔它们一样。

此时,您会发现 -jar 需要 jar 文件的名称。当您 运行 容器时,您可以将其作为参数传递,例如:

docker run -i -t se441/spring-petclinic:standalone spring-petclinic-2.2.0.BUILD-SNAPSHOT.jar

或者在入口点也指定:

ENTRYPOINT ["java", "-jar", "spring-petclinic-2.2.0.BUILD-SNAPSHOT.jar"]