从dockerfile构建docker映像,无法使Java正确运行,但可以在docker run命令中从映像中运行Java作为命令行参数

时间:2018-10-05 23:42:12

标签: java docker dockerfile

我是docker和dockerfile文件的新手,刚开始尝试编写它们。我已经构建了一个简单的Java控制台应用程序,可以从dockerfile成功构建docker映像,但是如果我包含

CMD ["java","-jar","app.jar"]

当我尝试运行图像时,我总是收到bin / sh错误,通常是“找不到Java”或类似错误。

但是,当我不包括CMD行时,只需使用此Dockerfile来构建我的映像

FROM openjdk:8-jre-alpine
COPY app.jar /app.jar

然后运行

docker run -it --rm my-container:tag

然后我可以跑步

java -jar app.jar

,该应用程序将按预期运行。

我也可以跑步

docker run -it --rm my-container:tag java -jar app.jar

,该应用程序将按预期运行。

我读过的每本指南都说我应该能够使用上面写的CMD或ENTRYPOINT,但是什么都行不通。

在这个简单的示例中我可能会缺少什么?

谢谢你, 特雷弗

编辑:我正在MacOS Sierra上运行docker版本18.06.1-ce-mac73(26764)。我不确定docker是否以这种方式工作,但是我在公共docker hub中有两个映像版本。 v1的dockerfile是:

FROM openjdk:8-jre-alpine
COPY 454calendar.jar app.jar

v2的dockerfile是:

FROM openjdk:8-jre-alpine
ENV PROJECT_DIR=/app
WORKDIR $PROJECT_DIR
COPY 454calendar.jar $PROJECT_DIR

如果我添加

CMD [“java”,”-jar”,”454calendar.jar”]

到v2 dockerfile并重建,我在docker run命令中收到此错误。

/bin/sh: [“java”,”-jar”,”454calendar.jar”]: not found

在没有CMD行的情况下,我可以运行容器,并且它直接开始进入/ app工作目录,在此我可以运行java命令并执行程序。

我的公共docker存储库中的两个版本的容器在各自的dockerfile中都没有CMD行。

2 个答案:

答案 0 :(得分:1)

解决方案非常简单。感谢@Rakesh,我在MacOS上检查了TextEdit的配置,发现Smart Quotes已打开。一旦我关闭了该选项并重新输入了双引号,然后重新构建并运行了Docker容器,应用程序就会按预期方式启动。

答案 1 :(得分:0)

我认为您的方法没有任何问题。我能够制作一个HelloWorld应用程序,使其与下面的Dockerfile一起运行。

FROM openjdk:8-jre-alpine
RUN mkdir /app
RUN cd /app
COPY HelloWorld.jar /app/HelloWorld.jar
WORKDIR /app
CMD ["java","-jar", "HelloWorld.jar"]

我在以下Docker版本上

docker -v
Docker version 18.06.1-ce, build e68fc7a

docker-compose -v
docker-compose version 1.22.0, build f46880f