运行java程序的DockerFile

新手上路,请多包涵

嗨,我是 Docker 的新手,正在尝试从头开始编写一个新图像。我正在编写这个 dockerFile 来编译和运行同一目录中可用的简单 java 程序。

这是码头文件。

 FROM scratch
CMD javac HelloWorld.java
CMD java HelloWorld

Docker构建成功如下图

[root@hadoop01 myjavadir]# docker build -t runhelloworld .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon
Step 0 : FROM scratch
 --->
Step 1 : CMD javac HelloWorld.java
 ---> Running in 7298ad7e902f
 ---> f5278ae25f0c
Removing intermediate container 7298ad7e902f
Step 2 : CMD java HelloWorld
 ---> Running in 0fa2151dc7b0
 ---> 25453e89b3f0
Removing intermediate container 0fa2151dc7b0
Successfully built 25453e89b3f0

但是当我尝试运行时,它会抛出以下错误:

 [root@hadoop01 myjavadir]# docker run runhelloworld
exec: "/bin/sh": stat /bin/sh: no such file or directory
Error response from daemon: Cannot start container 676717677d3f1bf3b0b000d68b60c32826939b8c6ec1b5f2e9876969c60e22a4: [8] System error: exec: "/bin/sh": stat /bin/sh: no such file or directory
[root@hadoop01 myjavadir]#  exec: "/bin/sh": stat /bin/sh: no such file or directory
bash: exec:: command not found

请帮助解决同样的问题。


将第二行更改为 RUN 后更新。

 [root@hadoop01 myjavadir]# docker build -t runhelloworld .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon
Step 0 : FROM scratch
--->
Step 1 : RUN javac HelloWorld.java
---> Running in fdef2d65ac58
exec: "/bin/sh": stat /bin/sh: no such file or directory [8]
System error: exec: "/bin/sh": stat /bin/sh: no such file or directory

原文由 Priyanka.Patil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 760
2 个回答

解释

来自 Dockerfile 参考

一个 Dockerfile 中只能有一条 CMD 指令。如果您列出多个 CMD,则只有最后一个 CMD 会生效。

这就是为什么 javac 命令没有被执行并且启动容器导致 no such file or directory 被发现。

CMDENTRYPOINT 用于执行容器(入口点级别)后应启动的任务。

CMD 的主要目的是为正在执行的容器提供默认值。

这适用于行 CMD java HelloWorld ,但不适用于 CMD javac HelloWorld.java 这更像是一个构建步骤。这就是 RUN 的用途。

解决方案

将第二行更改为 RUN javac HelloWorld.java

 FROM scratch
RUN javac HelloWorld.java
CMD java HelloWorld

生成的已提交映像 [来自第二行] 将用于 Dockerfile 中的下一步。

更新

正如 Diyoda 指出的那样,确保 FROM 图像提供 java.lang.

原文由 michaelbahr 发布,翻译遵循 CC BY-SA 3.0 许可协议

您也可以通过编写 DockerFile 来节省自己,只需在本地镜像仓库中拥有 java 镜像,通过将您的程序传递给它来编译和运行您的 java 程序,这非常简单。

 $ docker run java:alpine java -version

$ docker run --rm -v $PWD:/app -w /app java:alpine javac Main.java

$ docker run --rm -v $PWD:/app -w /app java:alpine java Main

原文由 Amey Jadiye 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题