[嗨,我是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
Dockerfile中只能有一条CMD指令。如果列出一个以上的CMD,则只有最后一个CMD才会生效。
这就是为什么不执行javac
命令并在no such file or directory
中启动容器的结果。
CMD
和ENTRYPOINT
用于执行一旦执行容器(入口点级别)就应开始的任务。
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。
您也可以通过编写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
另一种方式...
构建图像
docker build -t imagename .
运行它(将Helloworld.java安装到容器中]
docker run -it -v ~/system-path:/javafolder imagename
键入这些命令以在容器内执行-
cd javafolder
javac HelloWorld.java
java HelloWorld
另一种运行方式可能是使用外壳文件。
CMD ["/bin/bash", "-ex", "run.sh"]
并且在您的run.sh文件中,您可以运行javac和java命令。
FROM Java:8
WORKDIR /
ADD HelloWorld.java HelloWorld.java
CMD javac HelloWorld.java
ADD HelloWorld.class HelloWorld.class
CMD java Test
更新您的Dockerfile中的上述详细信息,以重建Docker映像并运行。
您可以使用CMD或ENTRYPOINT。
样本:
CMD [“ sh”,“ -c”,“ java -jar Service.jar”]
有关在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/