用于运行Java程序的DockerFile

问题描述 投票:11回答:7

[嗨,我是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

请帮助解决相同问题。


将第二行更改为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
java docker
7个回答
11
投票

说明

Dockerfile reference开始。

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。


3
投票

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

1
投票

另一种方式...

  1. 您必须使用“ java:8”作为基本映像,或在“ ubuntu”映像上安装jdk。
  2. 构建图像

    docker build -t imagename .
    
  3. 运行它(将Helloworld.java安装到容器中]

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

键入这些命令以在容器内执行-

cd javafolder

javac HelloWorld.java

java HelloWorld

0
投票

另一种运行方式可能是使用外壳文件。

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

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


0
投票

FROM Java:8

WORKDIR /

ADD HelloWorld.java HelloWorld.java

CMD javac HelloWorld.java

ADD HelloWorld.class HelloWorld.class

CMD java Test

更新您的Dockerfile中的上述详细信息,以重建Docker映像并运行。


0
投票

您可以使用CMD或ENTRYPOINT。

样本:

CMD [“ sh”,“ -c”,“ java -jar Service.jar”]


0
投票

有关在Docker容器上运行Java Hello World程序的完整教程,请访问http://www.devopsrider.com/2019/11/19/hello-world-java-program-on-docker-container/

[这里,我编写了在docker容器上运行hello world程序而无需任何构建工具(例如gradle或maven)所需执行的所有命令和代码。

devopsrider@del1-lhp-n02552:~ sudo su
root@del1-lhp-n02552:~# mkdir devopsrider
root@del1-lhp-n02552:~# cd devopsrider
root@del1-lhp-n02552:~/devopsrider# vi Test.java

public class Test{
        public static void main(String args[]){
                System.out.println("Hello World");

        }
}

root@del1-lhp-n02552:~# javac Test.java
root@del1-lhp-n02552:~/devopsrider# ls
Test.class  Test.java

root@del1-lhp-n02552:~/devopsrider# vi manifest.txt
Manifest-Version: 1.2
Main-Class: Test

root@del1-lhp-n02552:~/devopsrider# jar cvfm Test.jar manifest.txt Test.class
added manifest
adding: Test.class(in = 413) (out= 287)(deflated 30%)

root@del1-lhp-n02552:~/devopsrider# ls
manifest.txt  Test.class  Test.jar  Test.java

root@del1-lhp-n02552:~# vi Dockerfile
FROM openjdk:8
ADD Test.jar Test.jar
ENTRYPOINT ["java", "-jar", "Test.jar"]

root@del1-lhp-n02552:~/devopsrider# docker build -f Dockerfile -t hello-world-image .

Sending build context to Docker daemon  6.656kB
Step 1/3 : FROM openjdk:8
8: Pulling from library/openjdk
Digest: sha256:c168e211f317cc5db38b19fe62641316dbc1e60e5b53ad45ee440ba8152c20b9
Status: Downloaded newer image for openjdk:8
 ---> 57c2c2d2643d
Step 2/3 : ADD Test.jar Test.jar
 ---> b7d512e51b60
Step 3/3 : ENTRYPOINT ["java", "-jar", "Test.jar"]
 ---> Running in 07c871318e8a
Removing intermediate container 07c871318e8a
 ---> 24b1a0acd314
Successfully built 24b1a0acd314
Successfully tagged hello-world-image:latest

root@del1-lhp-n02552:~/devopsrider# docker run hello-world-image
Hello World

有关在Docker容器上运行Java Hello World程序的完整教程,请访问http://www.devopsrider.com/2019/11/19/hello-world-java-program-on-docker-container/

© www.soinside.com 2019 - 2024. All rights reserved.