当前位置: 首页 > 知识库问答 >
问题:

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

左丘烨烁
2023-03-14

我是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中心有两个图像版本。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和rebuild,我使用dockerrun命令得到这个错误。

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

没有CMD行,我可以运行container,它直接启动到/app工作目录,在那里我可以运行java命令并执行程序。

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

共有2个答案

骆照
2023-03-14

我看你的方法没有任何问题。我能够制作一个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
汝岳
2023-03-14

解决方案简单得令人恼火。感谢@Rakesh,我在MacOS上检查了TextEdit的配置,发现智能报价已经打开。一旦我关闭了这个选项,重新输入双引号,然后重建并运行docker容器,应用程序就像预期的那样启动了。

 类似资料:
  • 问题内容: 我尝试在构建映像的同时使用Docker安装软件,然后得到了。 我使用的Dockerfile 有没有一种方法可以在Dockerfile中运行docker命令来创建映像? 问题答案: 您的问题不在于Docker命令,因为它在错误消息中表示您的Docker守护程序未运行,或者由于某些配置问题而无法连接到它。 您刚刚安装了Docker吗?您是否完成了《安装指南》中的所有步骤? 您可以使用或来测

  • 我正在使用包含所有maven配置、密钥、maven命令和所有内容的sh文件,我想从Dockerfile内部执行这个sh文件,以便在运行容器时执行sh文件。 这是我的Docker文件的外观: DockerTest。sh文件如下所示。 当我创建docker图像并运行该图像时,它显示了这个错误。我试过很多东西,但仍然不起作用,这表明了这个错误 尚未为此生成指定目标。您必须以以下格式指定有效的生命周期阶段

  • 我有一个简单的Jenkins管道,它创建了一个包含3个容器的pod——jnlp、dind和示例测试 如下所示- 还定义了几个阶段- 现在我的根文件夹中有了这个脚本“示例”,我想运行它,但不知怎么的,它找不到。 Dockerfile看起来像这样- pwd返回“/home/jenkins/agent/workspace/test pipeline”,而不是docker容器路径。 结果如下- 你知道怎么

  • 目前,我发现谷歌云构建发生在构建docker图像的时候(不像我想象的那样,它会构建我的图像,然后执行我的图像来完成所有的构建)。那是在这篇文章里 谷歌云构建的快速启动 我有一个Dockerfile现在很简单 我有一个单一的下载和提取下载任何工件(zip文件)从最后的单构建运行构建(只有修改的服务器被构建或依赖于上一个CI构建的变化的服务器被构建,就像下游库可能被更改)。第一行只是列出了我需要在一个

  • 问题内容: 我从dockerfile构建了Docker映像。我看到映像已成功构建,但是该如何处理?它不应该能够作为容器运行吗? 问题答案: 运行它的具体方法取决于您是否为图像指定了标签/名称。 使用名称(让我们使用 Ubuntu ): 没有名称,只需使用ID: 请参阅 Docker运行参考 以获取更多信息。

  • 问题内容: 我使用Java创建了一个Docker映像,并将jar文件复制到该映像中。我的Dockerfile是: 执行以下命令后: 在控制台中,我看到了应用程序的输出,一切都很好。但是当我停止图像时,我不知道如何再次运行图像?当我执行以下命令时: 该应用程序再次运行,但是在我的Dockerfile中,我已经编写了此命令。如何在不使用此命令的情况下运行映像并使应用程序自动运行? 问题答案: 图像和容