283 votes

standard_init_linux.go:190 : exec user process caused "no such file or directory" - Docker

Lorsque j'exécute mon image Docker sur Windows 10. J'obtiens cette erreur :

standard_init_linux.go:190: exec user process caused "no such file or directory"

mon fichier docker est :

FROM openjdk:8

EXPOSE 8080

VOLUME /tmp

ADD appagent.tar.gz /opt/app-agent
ADD services.jar app.jar
ADD run.sh /run.sh

# Install compiler and perl stuff
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y gcc-multilib
RUN apt-get install -y perl

# Install Percona Toolkit
RUN apt-get install --yes percona-toolkit
RUN ["chmod", "+x", "/run.sh"]
ENTRYPOINT ["/run.sh"]

et le script commence par #!/bin/sh

#!/bin/sh
set -e

JAVA_OPTS="-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/urandom"

if [ "${APPD_APP_NAME}" != "" ]; then
JAVA_AGENT="-javaagent:/opt/app-agent/javaagent.jar
fi

exec java ${JVM_OPTS} ${JAVA_OPTS} ${JAVA_AGENT} -jar /app.jar

Méthode essayée1 : J'ai essayé de changer #!/bin/sh en #!/bin/bash mais je reçois la même erreur.

J'ai essayé la méthode 2 : ajout de dos2unix dans le fichier docker

RUN apt-get install -y dos2unix
RUN dos2unix /run.sh

494voto

Vikas Rathore Points 1317

Utilisez notepad++, allez à edit -> EOL conversion -> changez de CRLF à LF.

21 votes

C'est parfait ! J'avais ajouté un fichier .sh qui était exécuté depuis mon Dockerfile. J'ai remplacé les fins de lignes et Ta Da. Je vous remercie

3 votes

Je n'ai pas trouvé cette option dans notepad++ dans l'onglet 'edit' mais je l'ai changée en cliquant sur le bouton en bas à droite qui a écrit Windows( CR LF) et j'ai changé pour Unix. Merci beaucoup !

1 votes

J'ai le même problème et je le résous en suivant vos conseils. Merci beaucoup !

149voto

daB0bby Points 480

J'ai eu le même problème en utilisant le alpine image.

Mon .sh avait la première ligne suivante :

#!/bin/bash

Alpine ne dispose pas de bash. Donc, en changeant la ligne en

#!/bin/sh

ou en installant bash avec

apk add --no-cache bash

a résolu le problème pour moi.

11 votes

Ceci ! Devrait être en gras sur la page Docker Hub d'Apline.

0 votes

Oui, c'est ça. Si vous utilisez un entrypoint.sh avec Alpine utilisation de l'image docker #!/bin/sh au lieu de bash !

0 votes

Remercions le ciel pour cette réponse ! Vous avez sauvé ma peau, mon bon monsieur. Je lance une pièce pour vous !

135voto

prity Points 521

Changer le point d'entrée comme ci-dessous. Cela a fonctionné pour moi

ENTRYPOINT ["sh","/run.sh"]

Comme l'a souligné tuomastik dans les commentaires , les docs exigent que le premier paramètre soit l'exécutable :

L'ENTRYPOINT se présente sous deux formes :

ENTRYPOINT ["executable", "param1", "param2"] (forme exécutée, préférée)

ENTRYPOINT command param1 param2 (forme de coquille)

1 votes

Ça a marché pour moi. Dans ce cas, nous n'avons même pas besoin d'ajouter #!/bin/sh dans le script du shell. La mention de "sh" dans l'ENTRYPOINT fait le travail.

13 votes

Pouvez-vous expliquer pourquoi et quand le "sh" est nécessaire ? J'ai vu de nombreux exemples qui fonctionnent sans.

2 votes

@Opsse Sans "sh" le traitement normal du shell ne se produit pas source

31voto

KirKone Points 214

Dans mon cas, j'ai dû changer la fin de ligne de CRLF à LF pour le run.sh et l'erreur a disparu.

1 votes

Je dois réparer les mêmes fichiers encore et encore. C'est comme si Windows voulait me garder dans son écosystème.

0 votes

@JonathanCzitkovics Vous devriez peut-être vérifier votre configuration git et les paramètres de votre éditeur de code.

19voto

BMitch Points 3744

"No such file or directory" provient de Linux, et j'ai vu les causes suivantes :

La première cause est que le fichier ne se trouve pas dans votre conteneur. Certaines personnes essaient d'exécuter une commande depuis l'hôte sans l'ajouter à leur image. D'autres font de l'ombre à leur commande en montant un volume au-dessus de la commande qu'ils veulent exécuter. Si vous exécutez le même conteneur, mais avec un shell au lieu de la valeur normale du point d'entrée/de la commande, et que vous exécutez une commande de type ls /path/to/cmd vous verrez si cela existe.

La cause suivante est l'exécution d'une mauvaise commande. Cela se produit souvent lorsque le format json/exec de la commande à exécuter n'est pas analysé correctement. Si vous voyez une commande qui tente de s'exécuter ["app", ou quelque chose de similaire, la chaîne json n'a pas été analysée par Docker et Linux essaie d'utiliser un shell pour analyser la commande comme une chaîne. Cela peut également se produire si vous mal ordonnez les args, par exemple en essayant d'exécuter -it est un signe que vous avez essayé de placer des drapeaux après le nom de l'image alors qu'ils doivent être placés avant le nom de l'image.

Avec les scripts shell, cette erreur apparaît si la première ligne avec l'option #! pointe vers une commande qui n'existe pas dans le conteneur. Pour certains, il s'agit d'essayer d'exécuter bash dans une image qui a seulement /bin/sh . Et dans votre cas, cela peut provenir des linefeeds Windows dans le script. Si vous passez à des linéaires Linux/Unix dans votre éditeur, cela sera corrigé.

Avec les binaires, cette erreur apparaît si une bibliothèque liée est manquante. J'ai souvent vu cela lorsque des commandes Go compilées avec la commande libc mais courir sur alpine avec musl ou scratch sans aucune bibliothèque. Vous devez soit inclure toutes les bibliothèques manquantes, soit compiler statiquement votre commande. Pour voir ces liens de bibliothèques, utilisez ldd /your/app sur votre binaire.

3 votes

Merci ! Pour mon application go dans l'image scratch, j'ai dû reconstruire en utilisant CGO_ENABLED=0.

1 votes

Mon cas : 1. le binaire exécutable est construit à partir d'Alpine, mais l'image de base qui exécute la commande go est debian, donc une erreur s'est produite.

0 votes

Dans mon cas, le binaire a été construit en utilisant GraalVM Native Builder, par défaut il est construit sous une forme 'dynamique' qui apparemment nécessite une bibliothèque non présente dans Alpine. Après avoir ajouté --static pour construire un binaire statique, le problème a disparu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X