【问题标题】:DockerFile to run a java programDockerFile 运行 java 程序
【发布时间】:2016-05-19 09:08:15
【问题描述】:

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


【解决方案1】:

说明

来自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。

【讨论】:

  • 试过这个。现在 Docker 构建抛出相同的错误
  • [root@hadoop01 myjavadir]# docker build -t runhelloworld .将构建上下文发送到 Docker 守护进程 3.584 kB 将构建上下文发送到 Docker 守护进程 第 0 步:从头开始 ---> 第 1 步:运行 javac HelloWorld.java ---> 在 fdef2d65ac58 中运行 exec: "/bin/sh": stat /bin /sh: 没有这样的文件或目录 [8] 系统错误: exec: "/bin/sh": stat /bin/sh: 没有这样的文件或目录
  • 您确定存在 java 和 HelloWorld.java 文件吗?错误看起来不像。
  • file not found: HelloWorld.java --> 您没有将 HelloWorld 文件复制到您的容器中。使用COPY docs.docker.com/engine/reference/builder/#copy 做到这一点。
  • Dockerfile 和 HelloWorld.java 是否在同一个目录中无关紧要。 HelloWorld.java 必须通过COPY 命令在您的容器内
【解决方案2】:

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

    另一种方式...

    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
    

    【讨论】:

      【解决方案4】:

      另一种运行方式是使用 shell 文件。

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

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

      【讨论】:

        【解决方案5】:

        来自 java:8

        WORKDIR /
        
        ADD HelloWorld.java HelloWorld.java
        
        CMD javac HelloWorld.java
        
        ADD HelloWorld.class HelloWorld.class
        
        CMD java Test
        

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

        【讨论】:

          【解决方案6】:

          您可以使用 CMD 或 ENTRYPOINT。

          示例:

          CMD ["sh", "-c", "java -jar Service.jar"]

          【讨论】:

            【解决方案7】:

            尝试遵循这一点,我在下面提到了要遵循的所有步骤。

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

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

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

            步骤 2. 创建 ma​​nifest.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
            

            Step 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

            例子:

            存储库 |标签 |图片ID |创建尺寸 | | 58df7fdecdeb | 3 分钟前

            第 8 步。最后运行这个 cmd docker run 58df7fdecdeb,你可以看到输出为

            “Hello World”

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

            -- 快乐编码:)

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 2021-01-25
                • 2019-01-16
                • 2022-10-13
                • 1970-01-01
                • 2022-01-25
                • 1970-01-01
                • 2017-05-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多