Tout d'abord, désolé si ma question semble trop simple ou idiote. Je suis nouveau dans docker. J'ai créé mon image docker et passé plusieurs fichiers jar qui doivent être exécutés immédiatement lorsque le conteneur démarre. Je veux exécuter le script "serve.sh" immédiatement au démarrage du conteneur, j'ai réussi à bien créer les images, mais lorsque je lance le conteneur, cela me renvoie cette erreur:
C: \ Program Files \ Docker \ Docker \ resources \ bin \ docker.exe: réponse d'erreur du démon: la création de l'exécution OCI a échoué: container_linux.go: 349: le démarrage du processus de conteneur a provoqué "exec: \" - it \ ": fichier exécutable introuvable dans $ PATH ": inconnu.
Voici la commande que j'utilise pour exécuter l'image que j'ai désirée:
FROM openjdk:8-jdk-alpine EXPOSE 8080:8080 COPY apigateway-0.0.1-SNAPSHOT.jar apigateway.jar COPY authservice-0.0.1-SNAPSHOT.jar authservice.jar COPY institutionsservice-0.0.1-SNAPSHOT.jar institutionsservice.jar COPY messagesservice-0.0.1-SNAPSHOT.jar messagesservice.jar COPY postsservice-0.0.1-SNAPSHOT.jar postsservice.jar COPY userservice-0.0.1-SNAPSHOT.jar userservice.jar COPY serve.sh serve.sh CMD [ "bash" "./serve.sh" ]
Voici mon fichier docker:
docker run b24b37614e1a -it
S'il vous plaît, qu'est-ce que je fais de mal? Je suis nouveau dans Docker
3 Réponses :
Gardez à l'esprit que docker soutient que l'ordre est important:
vous avez écrit docker run b24b37614e1a -it
qui est différent de
docker run -it b24b37614e1a
J'espère que cela résout votre problème :)
Il y a quelques choses que vous devriez corriger, la première est le format CMD
qui devrait être
docker run -p $HOST_PORT:$APP_PORT b24b37614e1a
docker run -it b24b37614e1a
Une autre chose, lorsque vous docker run
, les instructions sont
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
ce qui signifie que toutes les options doivent être avant IMAGE
et dans votre cas, it
apparaissent après IMAGE
.
La commande correcte doit être
CMD [ "/bin/bash" , "./serve.sh" ]
BTW , petite question, pourquoi vous souhaitez exécuter un conteneur interactif de cette application. Idéalement, cela devrait être quelque chose comme
CMD instruction has three forms: CMD ["executable","param1","param2"] (exec form, this is the preferred form) CMD ["param1","param2"] (as default parameters to ENTRYPOINT) CMD command param1 param2 (shell form)
-p
=> Publier le (s) port (s) d'un conteneur sur l'hôte
et ensuite vous pouvez accéder à votre application localhost:$HOST_PORT
ou localhost:$HOST_PORT
machine_IP:$HOST_PORT
Merci, l'instruction EXPOSE remplace-t-elle -p? Je pensais que c'était le cas, je l'ai ajouté à mon fichier docker en sautant qu'il fera exactement cela
Merci, j'ai fait exactement ce que vous avez dit, mais maintenant, j'obtiens cette erreur: "sh: ./serve.sh: opérande inconnu" J'ai mis à jour mon instruction CMD vers: CMD ["bin / bash" "./serve.sh" ]
J'ai modifié ma réponse et ajouté CMD, veuillez jeter un œil
docker run -it
puis args (c / o Luca Fabbian)bash
. Utilisez sh
. (c / o Empereur MC)CMD ["sh", "./serve.sh"]
CMD ./serve.sh
CMD ["./serve.sh"]
Cela suppose que vous avez déjà suivi les conseils de Luca:
Gardez à l'esprit que l'ordre des arguments de docker est important: vous avez écrit docker run b24b37614e1a -it qui est différent de docker run -it b24b37614e1a
bash
. J'ai tiré l'image openjdk:8-jdk-alpine
pour confirmer, et elle n'est pas openjdk:8-jdk-alpine
avec bash. Les images Alpine sont livrées avec sh
donc le code fourni ne fonctionnera jamais à moins que vous ne corrigiez le shell utilisé ou n'installiez bash.
De votre réponse à nischay:
J'obtiens cette erreur: "sh: ./serve.sh: opérande inconnu"
J'ai mis à jour mon instruction CMD vers: CMD ["bin / bash" "./serve.sh"]
CMD sous la forme exec prend un tableau d'instructions. Ceux-ci doivent être séparés par une virgule.
Faites ceci:
CMD [ "./serve.sh" ]
Comme l'a dit nischay, il existe plusieurs façons d'utiliser CMD pour faire à peu près la même chose, à partir de la référence citée.
Vous pouvez en fait utiliser la forme exec de CMD pour dire des choses comme:
CMD [ "sh", "./serve.sh" ]
Il n'est pas nécessaire de taper /bin/sh
ou /bin/bash
ou le shell de votre choix, sauf si vous le souhaitez. Mais si vous n'avez pas besoin du shell, vous pouvez également utiliser le formulaire exec sans le shell:
CMD [ "executable", "param1" ] ^
CMD [ "/bin/bash" "./serve.sh" ]
t-il avecCMD [ "/bin/bash" "./serve.sh" ]
? Ou bien, je ne suis pas sûr, mais il y a de fortes chances que les images alpines ne contiennent pas de bash. Ils sont conçus pour être minuscules.Eh, je n'ai pas non plus remarqué votre ordre des arguments. Ce devrait être
docker run -it b24b37614e1a
effet.Double possible: stackoverflow.com/q/50761557/596285