您好我是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
答案 0 :(得分:11)
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。
答案 1 :(得分:1)
另一种方式......
构建图片
docker build -t imagename .
运行它(将Helloworld.java挂载到容器中)
docker run -it -v ~/system-path:/javafolder imagename
键入这些命令以在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。谢谢朱莉娅·邦达丘克
-快乐的编码:)