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

运行java程序的DockerFile

夹谷弘亮
2023-03-14

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

这是DockerFile。

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
[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

共有1个答案

丌官昊天
2023-03-14

从Dockerfile引用。

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

这就是为什么不执行javac命令,并且启动容器时会发现no such file or directory

这适用于cmd java helloworld行,但不适用于cmd javac helloworld.java行,后者更像是一个构建步骤。这就是run的作用。

将第二行更改为run javac helloworld.java

FROM scratch
RUN javac HelloWorld.java
CMD java HelloWorld

结果提交的图像[来自第2行]将用于DockerFile的下一步。

正如Diyoda指出的,确保from映像提供Java。

 类似资料:
  • 问题内容: 我看了一些其他的SO问题,没有找到任何解决我问题的方法…我有一个Main.java文件(如下)和一个OthelloLib.jar文件,没有关联的源文件。 运行失败,并 还有更多错误。SimplePlayer和BetterPlayer在jar中定义。我如何告诉Java这个罐子?这个命令:不会引起错误,但是我仍然不知道如何运行程序。如果我运行,java会抱怨: 但是TimeoutExcep

  • 万事知其然,要知其所以然,所以本节带大家来详细了解一下 Java 程序的执行过程。 从《 使用记事本编写运行Java程序》一节的案例可以看出, Java 程序的运行必须经过编写、编译和运行 3 个步骤。 编写:是指在 Java 开发环境中进行程序代码的输入,最终形成后缀名为 .java 的 Java 源文件。 编译:是指使用 Java 编译器对源文件进行错误排査的过程,编译后将生成后缀名为 .cl

  • 问题内容: 您将如何依次执行三个线程?例如。线程1,线程2,线程3。不可能将一个线程的引用传递给另一个线程并从run()方法调用。 因此代码应如下所示: 并应该把 这可以通过使用ThreadPoolExecutor并使用阻塞队列来实现,但即使那样也不是可以接受的答案。 问题答案: 在java.util.concurrent包中使用ExecutorService。更精确地使用

  • 我在目录位置/home/oracle/naresh 文件可插入。java,可插入。类,runjava。sh,ojdbc6。jar位于/home/oracle/naresh目录位置 InsertToTable.java是将数据插入到表中的文件。它在运行时利用ojdbc6.jar。当独立运行下面的外壳脚本时,java将成功运行并将数据插入到表中。 从cron运行相同的shell脚本时,java文件未运

  • 问题内容: 所以我在这里有一个菜鸟般的时刻,我以前从未使用过命令行来运行Java程序,但现在我需要。我遇到的问题是,当我尝试运行程序时,出现ClassNotFoundException。我的课叫做OmadUpdate。我已经使用javac命令将OmadUpdate.java文件编译为OmadUpdate.class。我已经检查了目录,并且它们都绝对存在,但是当我运行java OmadUpdate命