2016-02-09 71 views
6

嗨,我是新來的Docker,並試圖從頭開始寫一個新的圖像。我正在編寫這個dockerFile來編譯和運行一個簡單的java程序在同一個目錄下。DockerFile運行一個java程序

這是dockerfile。

FROM scratch 
CMD javac HelloWorld.java 
CMD java HelloWorld 

泊塢構建成功如下圖所示

[[email protected] 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 

但是,當我嘗試運行,它引發以下錯誤:

[[email protected] 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 
[[email protected] myjavadir]# exec: "/bin/sh": stat /bin/sh: no such file or directory 
bash: exec:: command not found 

請幫助解決一樣。


將第二行改爲RUN後進行更新。

[[email protected] 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

你可以嘗試從Java,而不是從頭開始,因爲它需要Java的依賴最小運行Java應用程序 –

+0

http://stackoverflow.com/questions/31696439/how-to-build-a- docker-container-for-java-app/31710204#31710204 –

回答

8

說明

Dockerfile reference

There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.

這就是爲什麼不執行命令javacno such file or directory啓動你的容器結果被發現。

CMDENTRYPOINT用於執行容器(入口級別)後應啓動的任務。

The main purpose of a CMD is to provide defaults for an executing container.

這適用於行CMD java HelloWorld,但不CMD javac HelloWorld.java哪個更構建步驟的。這就是RUN的用途。

更改第二行RUN javac HelloWorld.java

FROM scratch 
RUN javac HelloWorld.java 
CMD java HelloWorld 

The resulting committed image [from line two] will be used for the next step in the Dockerfile.

更新

由於Diyoda指出,確保在FROM圖像提供了Java。

+0

試過這個。現在,Docker構建拋出相同的錯誤 –

+0

[root @ hadoop01 myjavadir]#docker build -t runhelloworld。 發送建立上下文多克爾守護程序3.584 KB 發送建立上下文多克爾守護程序 步驟0:從頭 ---> 第1步:運行javac HelloWorld.java --->在fdef2d65ac58 EXEC運行:「/ bin中/ sh「:stat/bin/sh:沒有這樣的文件或目錄 [8]系統錯誤:exec:」/ bin/sh「:stat/bin/sh:沒有這樣的文件或目錄 –

+0

確定java和HelloWorld .java文件存在?該錯誤看起來像他們不是。 – michaelbahr

0

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

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

,並在你的run.sh文件,你可以運行javac和java命令。

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

執行您可以通過編寫Dock來保存自己erFile也是如此,只需在本地映像倉庫中有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