web-dev-qa-db-fra.com

Impossible d'exécuter le fichier de script dans le menu fixe, aucun fichier ou répertoire de ce type

J'ai un Dockerfile comme celui-ci:

FROM Alpine

COPY setup.sh /setup.sh

CMD ["/setup.sh"]

Mon setup.sh est comme ceci:

#!/bin/sh

echo "hello world"

J'ai essayé d'exécuter ces commandes:

docker build .
docker run --name test 61230f9f45ad

L'erreur retournée est la suivante:

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

J'utilise Powershell sur Windows 10 LTSB, la version Docker est 17.12.0-ce, build c97c6d6. Pourquoi?

6
Cris

Ce sont probablement les fins de ligne de style Windows qui le cassent. Voici à quoi ressemble le fichier lorsqu'il est enregistré avec des fins de ligne Windows, mais lu dans le style Unix:

#!/bin/sh^M
^M
echo "hello world"^M 

Lors de l'interprétation du Shebang (#!), exec verra un retour chariot supplémentaire (noté CR, \r, ^M) et ne trouve pas /bin/sh^M:

$ exec ./setup.sh
bash: setup.sh: /bin/sh^M: bad interpreter: No such file or directory 

Enregistrez le fichier avec des fins de ligne de style Unix. Sous Windows, des éditeurs de texte décents (Sublime Text, Notepad ++, n'importe quel IDE, etc.) devraient pouvoir le faire. Il existe également un outil de ligne de commande simple appelé dos2unix, qui fait exactement ce que vous attendez.

11
Norrius

l'image Alpine utilise busybox , et il n'y a pas de Shell dans busybox car il n'est pas vraiment destiné aux humains.

Pour votre information remplacer

CMD ["/setup.sh"]

par:

CMD /bin/busybox ls -al /bin

Vous obtenez:

lrwxrwxrwx    1 root     root            12 Jan  9 19:37 ash -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 base64 -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 bbconfig -> /bin/busybox
-rwxr-xr-x    1 root     root        805024 Dec 12 10:42 busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 cat -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chgrp -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chmod -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 chown -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 conspy -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 cp -> /bin/busybox

[... snip ...]

lrwxrwxrwx    1 root     root            12 Jan  9 19:37 tar -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 touch -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 true -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 umount -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 uname -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 usleep -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 watch -> /bin/busybox
lrwxrwxrwx    1 root     root            12 Jan  9 19:37 zcat -> /bin/busybox

De plus, si vous regardez /lib de la même manière, vous constaterez que les bibliothèques habituelles ne sont pas là puisque busybox utilise musl au lieu de glibc.

En règle générale, tout ce qui se fait dans votre setup.sh devrait être fait avec les instructions RUN dans le Dockerfile de toute façon?

PS: Incidemment,

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

signifie que l'exécutable est introuvable ou que l'une de ses bibliothèques requises n'est pas trouvée, ce qui rend le débogage du Dockerfile assez difficile.

2
xenoid