DockerFile运行一个java程序

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

这是dockerfile。

FROM scratch CMD javac HelloWorld.java CMD java HelloWorld 

Docker构build成功,如下所示

 [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 

说明

从Dockerfile参考 。

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

这就是为什么没有执行javac命令,并启动您的容器结果no such file or directoryfindno such file or directory

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

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

这适用于行CMD java HelloWorld ,但不适用于CMD javac HelloWorld.java这是更多的构build步骤。 那是RUN的意思。

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

 FROM scratch RUN javac HelloWorld.java CMD java HelloWorld 

由此产生的提交的图像[来自第二行]将用于Dockerfile中的下一步。

更新

正如Diyoda指出的,确保FROM图像提供java。

其他方式…

  1. 你必须使用“java:8”作为基础映像,或在“Ubuntu”映像上安装jdk。
  2. build立形象

     docker build -t imagename . 
  3. 运行它(将Helloworld.java挂载到容器)

     docker run -it -v ~/system-path:/javafolder imagename 

键入这些命令在容器中执行 –

 cd javafolder javac HelloWorld.java java HelloWorld 

运行它的另一种方法可能是使用shell文件。

 CMD ["/bin/bash", "-ex", "run.sh"] 

在你的run.sh文件中,你可以运行javac和java命令。

你也可以通过编写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