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?
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.
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.