DockerFile运行java程序

时间:2016-02-09 11:36:58

标签: java docker

您好我是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

8 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

另一种方式......

  1. 你必须使用&#34; java:8&#34;作为基本图像或在&#34; ubuntu&#34;上安装jdk图像。
  2. 构建图片

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

    docker run -it -v ~/system-path:/javafolder imagename
    
  4. 键入这些命令以在container-

    中执行
    cd javafolder
    
    javac HelloWorld.java
    
    java HelloWorld
    

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

从Java:8

WORKDIR /

ADD HelloWorld.java HelloWorld.java

CMD javac HelloWorld.java

ADD HelloWorld.class HelloWorld.class

CMD java Test

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

答案 5 :(得分:0)

您可以使用CMD或ENTRYPOINT。

样品:

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

答案 6 :(得分:0)

在这里,我正在编写所有需要执行的命令和代码,以在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/

答案 7 :(得分:0)

尝试遵循此步骤,我已经在下面提到了要遵循的所有步骤。

步骤1。创建一个Java文件 HelloWorld.java

public class HelloWorld {

  public static void main(String[] args){

    System.out.println("Hello World! ");

  }

步骤1.1生成类文件,例如: javac HelloWorld.java

第2步。创建 manifest.txt 文件

Manifest-Version: 1.0
Main-Class: HelloWorld

步骤3.创建jar文件,例如: jar cfm HelloWorld.jar manifest.txt HelloWorld.class

步骤4.创建一个名为 Dockerfile (无扩展名)

的文件
FROM java:7

WORKDIR /

ADD HelloWorld.jar HelloWorld.jar

EXPOSE 8080

CMD java -jar HelloWorld.jar

第5步。退出当前目录例如:从C:/ custom-docker / java-docker到C:/ custom-docker并运行此cmd docker build -t java-docker(使用文件夹名称,此处为java -docker)

注意:对于Windows,以 administrator 身份运行命令提示符,或者在linux的所有命令中以 sudo 前缀运行

第6步。跳过(推拉)-可选

第7步。运行此cmd docker images 并找到最新的图像ID

示例:

存储库| TAG |图片编号|尺寸增加 <无> | <无> | 58df7fdecdeb | 3分钟前

第8步。最后运行此cmd docker run 58df7fdecdeb ,您可能会看到输出为

“ Hello World”

PS。谢谢朱莉娅·邦达丘克

-快乐的编码:)