我的 Dockerfile 哪里出了问题?

时间:2021-03-14 22:38:57

标签: docker path dockerfile executable

我在包含 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 文件肯定在那里。在容器中,我可以成功运行 jar。关于为什么在使用上面列出的 Dockerfile 构建/运行时找不到 jar 文件的任何建议。将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

变化:

ENTRYPOINT ["java -jar"]

到:

ENTRYPOINT ["java", "-jar"]

exec 语法(使用 json 数组)不做任何命令行解析,你用 shell 得到,所以它寻找文字二进制 java -jar 而不是 java 并传递 {{ 1}} 论点。您需要将每个参数作为另一个数组条目进行分隔,就像在命令行中用空格分隔它们一样。

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

-jar

或者在入口点也指定:

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