web-dev-qa-db-fra.com

DockerFile pour exécuter un programme Java

Bonjour, je suis nouveau sur Docker et j'essaie d'écrire une nouvelle image à partir de rien. J'écris ce fichier docker pour compiler et exécuter un programme Java simple disponible dans le même répertoire.

Voici le fichier docker.

FROM scratch
CMD javac HelloWorld.Java
CMD Java HelloWorld

La construction de Docker est réussie comme indiqué ci-dessous

[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

Mais lorsque j'essaie de courir, l'erreur suivante est générée:

[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

S'il vous plaît aider à résoudre le même.


Mise à jour après modification de la deuxième ligne en 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
9
Priyanka.Patil

Explication

De la référence Dockerfile .

Il ne peut y avoir qu'une seule instruction CMD dans un fichier Docker. Si vous listez plus d’un CMD, seul le dernier CMD prend effet.

C'est pourquoi la commande javac n'est pas exécutée et le démarrage de votre conteneur a pour résultat que no such file or directory a été trouvé.

CMD et ENTRYPOINT sont utilisés pour les tâches qui doivent être lancées une fois que vous exécutez le conteneur (niveau du point d'entrée). 

L'objectif principal d'un CMD est de fournir des valeurs par défaut pour un conteneur en cours d'exécution.

Cela s’applique à la ligne CMD Java HelloWorld, mais pas à CMD javac HelloWorld.Java, qui est plutôt une étape de construction. C’est à cela que sert RUN.

Solution

Modifiez la deuxième ligne en RUN javac HelloWorld.Java.

FROM scratch
RUN javac HelloWorld.Java
CMD Java HelloWorld

L'image validée obtenue [à partir de la ligne deux] sera utilisée pour la prochaine étape dans le Dockerfile.

Mettre à jour

Comme l'a souligné Diyoda , assurez-vous que l'image FROM fournit Java.

11
michaelbahr

Vous pouvez aussi vous sauver en écrivant DockerFile. Il vous suffit d’avoir une image Java dans votre dépôt d’image local, de compiler et d’exécuter votre programme Java en y passant votre programme, c’est très simple.

$ 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
1
Amey Jadiye

Autrement...

  1. vous devez utiliser "Java: 8" comme image de base ou installer jdk sur l'image "Ubuntu".
  2. construire l'image

    docker build -t imagename .
    
  3. lancez-le (montage de Helloworld.Java sur un conteneur)

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

tapez ces commandes à exécuter à l'intérieur du conteneur- 

cd javafolder

javac HelloWorld.Java

Java HelloWorld
1
Shashank G

DE Java: 8

WORKDIR /

ADD HelloWorld.Java HelloWorld.Java

CMD javac HelloWorld.Java

ADD HelloWorld.class HelloWorld.class

CMD Java Test

Mettez à jour les détails ci-dessus dans votre Dockerfile pour reconstruire l’image de docker et exécutez-le.

0

Vous pouvez utiliser CMD ou ENTRYPOINT.

Échantillon :

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

0
rex roy

Une autre façon de l'exécuter pourrait être avec un fichier Shell.

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

et dans votre fichier run.sh, vous pouvez exécuter les commandes javac et Java.

0
Nilo_DS