2016-02-09 9 views
6

Hallo, ich bin neu in Docker und versuche, ein neues Bild von Grund auf neu zu schreiben. Ich schreibe diese dockerFile, um ein einfaches Java-Programm zu kompilieren und auszuführen, das im selben Verzeichnis verfügbar ist.DockerFile zum Ausführen eines Java-Programms

Hier ist die Dockerfile.

FROM scratch 
CMD javac HelloWorld.java 
CMD java HelloWorld 

Docker Build ist erfolgreich wie unter

[[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 

gezeigt Aber wenn ich zu laufen versuchen, wirft es den folgenden Fehler:

[[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 

Bitte helfen, das Gleiche zu lösen.


Aktualisierung nach der zweiten Zeile zu 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

Sie können aus Java versuchen, anstatt von Grund auf, weil es die minimale Abhängigkeit von Java benötigt eine Java-Anwendung auszuführen –

+0

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

Antwort

8

Erklärung

Vom 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.

Deshalb ist der javac Befehl nicht ausgeführt wird und Ihre Container Ergebnisse in no such file or directory Start gefunden wurde.

CMD und ENTRYPOINT werden für die Aufgaben verwendet, die gestartet werden sollen, sobald Sie den Container (Einstiegspunktebene) ausführen.

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

, die auf der Linie gilt CMD java HelloWorld, aber nicht beschränkt auf CMD javac HelloWorld.java, die mehr von einem Build-Schritt ist. Das ist, was RUN ist.

Lösung

Ändern Sie die zweite Zeile 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.

aktualisieren

Wie Diyoda darauf hingewiesen, stellen Sie sicher, dass die FROM Bild liefert Java.

+0

Versucht dies. Jetzt Docker bauen, werfen den gleichen Fehler –

+0

[root @ hadoop01 myjavadir] # Docker Build-t Runheloworld. bauen Senden Kontext Docker Daemon 3.584 kB Kontext Daemon Docker bauen Senden Schritt 0: von Grund auf ---> Schritt 1: RUN Javac HelloWorld.java ---> in fdef2d65ac58 exec ausgeführt wird: „/ bin/sh ": stat/bin/sh: keine solche Datei oder Verzeichnis [8] Systemfehler: exec:"/bin/sh ": stat/bin/sh: keine solche Datei oder Verzeichnis –

+0

Sind Sie sicher, Java und HelloWorld .java-Datei vorhanden? Der Fehler sieht so aus, als wären sie nicht. – michaelbahr

0

Eine andere Möglichkeit, es auszuführen, könnte mit einer Shell-Datei sein.

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

und in Ihrer run.sh Datei können Sie die javac und java-Befehle ausführen.

1

Eine andere Art und Weise ...

  1. Sie haben "java: 8" verwenden als Basis-Image oder installieren jdk auf "ubuntu" Bild.
  2. build das Bild

    docker build -t imagename . 
    
  3. run es

    docker run -it -v ~/system-path:/javafolder imagename 
    

Typ diese Befehle (Helloworld.java zum Behältermontage) innerhalb Container-

cd javafolder 

javac HelloWorld.java 

java HelloWorld 
0

auszuführen Sie können sich selbst retten, indem Sie Dock schreiben ErFile auch, nur Java-Bild in Ihrem lokalen Bild Repo, kompilieren und führen Sie Ihr Java-Programm durch die Weitergabe Ihres Programms, es ist sehr einfach.

$ 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 
Verwandte Themen