3
votes

Impossible d'exécuter l'image Docker

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 commentaires

CMD [ "/bin/bash" "./serve.sh" ] t-il avec CMD [ "/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


3 Réponses :


3
votes

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 :)


0 commentaires

3
votes

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


3 commentaires

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



0
votes

tl; dr
  • docker run -it puis args (c / o Luca Fabbian)
  • Vous n'avez pas de bash . Utilisez sh . (c / o Empereur MC)
  • Le formulaire exécutable CMD nécessite un tableau, utilisez donc des virgules : CMD ["sh", "./serve.sh"]
  • CMD a une forme shell si vous oubliez facilement la syntaxe: CMD ./serve.sh
  • N'exécutez même pas le shell si vous n'avez pas à: CMD ["./serve.sh"]

L'ordre des arguments est important

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

Vous n'avez pas de 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.

"opérande inconnu"

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" ]

Une note sur l'utilisation de CMD

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" ]
                  ^

0 commentaires