2017-09-23 1 views
2

Je suis en train de construire le Dockerfile ci-dessous, mais il échoue après le RUN ocp-indent --help disant ocp-indent: not found The command '/bin/sh -c ocp-indent --help' returned a non-zero code: 127La commande a renvoyé un code non nul: 127

FROM ocaml/opam 

WORKDIR /workdir 

RUN opam init --auto-setup 
RUN opam install --yes ocp-indent 
RUN ocp-indent --help 

ENTRYPOINT ["ocp-indent"] 
CMD ["--help"] 

Je défoncé dans l'image qui a eu lieu avant via docker run -it <image id> bash -il et couru ocp-indent --help et il a bien fonctionné. Vous ne savez pas pourquoi cela échoue, des pensées?

+0

Je ne sais pas pourquoi il serait nécessaire si 'des œuvres run', mais avez-vous essayé spécifier un chemin complet' ocp- indent'? – kichik

+0

Comment? 'Exécuter '? – user1795832

+0

Ouais. C'est probablement dans '/ bin' ou'/usr/bin'. – kichik

Répondre

2

Il s'agit d'un problème et d'un profil liés à PATH. Lorsque vous utilisez sh -c ou bash -c les fichiers de profil ne sont pas chargés. Mais lorsque vous utilisez bash -lc cela signifie charger le profil et également exécuter la commande. Votre profil peut maintenant avoir la configuration de chemin nécessaire pour exécuter cette commande.

Modifier-1

Donc la question avec la réponse initiale est que cela ne fonctionne pas. Lorsque nous avons eu

ENTRYPOINT ["/bin/bash", "-lc", "ocp-indent"] 
CMD ["--help"] 

Il traduit enfin /bin/bash -lc ocp-indent --help tout pour que cela fonctionne, nous devons /bin/bash -lc "ocp-indent --help". Cela ne peut pas être fait directement en utilisant la commande dans entrypoint. Nous devons donc faire un nouveau fichier entrypoint.sh

#!/bin/sh -l 
ocp-indent "[email protected]" 

Assurez-vous de chmod +x entrypoint.sh sur l'hôte. Et mettre à jour le Dockerfile au-dessous

FROM ocaml/opam 

WORKDIR /workdir 

RUN opam init --auto-setup 
RUN opam install --yes ocp-indent 
SHELL ["/bin/sh", "-lc"] 
COPY entrypoint.sh /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 
CMD ["--help"] 

Après la construction et l'exécuter fonctionne

$ docker run f76dda33092a 
NAME 
     ocp-indent - Automatic indentation of OCaml source files 

SYNOPSIS 

réponse originale

Vous pouvez facilement tester la différence entre les deux à l'aide des commandes ci-dessous

docker run -it --entrypoint "/bin/sh" <image id> env 
docker run -it --entrypoint "/bin/sh -l" <image id> env 
docker run -it --entrypoint "/bin/bash" <image id> env 
docker run -it --entrypoint "/bin/bash -l" <image id> env 

Maintenant, soit vous bash a cor chemin rectiligne par défaut ou il ne viendra que lorsque vous utiliserez le drapeau -l. Dans ce cas, vous pouvez modifier le shell par défaut de votre image ci-dessous docker à

FROM ocaml/opam 

WORKDIR /workdir 

RUN opam init --auto-setup 
RUN opam install --yes ocp-indent 
SHELL ["/bin/bash", "-lc"] 
RUN ocp-indent --help 

ENTRYPOINT ["/bin/bash", "-lc", "ocp-indent"] 
CMD ["--help"] 
+0

La ligne 'SHELL' semble devoir dépasser les lignes' RUN'. Merci. – user1795832

+0

À quelle image devrais-je exécuter ces commandes 'docker run'? Mettre le SHELL au-dessus de WORKDIR et le construire a créé l'image, mais ne s'exécute pas dans un conteneur à cause de cette erreur: 'Error response from daemon: Erreur d'exécution oci: container_linux.go: 262: démarrage du processus du conteneur causé" exec: \ " ocp-indent \ ": fichier exécutable introuvable dans $ PATH" ' – user1795832

+0

@ user1795832, mon mauvais, vous auriez dû utiliser' ENTRYPOINT ["/ bin/bash", "-lc", "ocp-indent"] '. Mise à jour le code dans la réponse –