私はこのようなDockerfileを持っています:
FROM Alpine
COPY setup.sh /setup.sh
CMD ["/setup.sh"]
私のsetup.shは次のようなものです:
#!/bin/sh
echo "hello world"
これらのコマンドを実行しようとしました:
docker build .
docker run --name test 61230f9f45ad
返されるエラーはこれです:
standard_init_linux.go:195: exec user process caused "no such file or directory"
Windows 10 LTSBでPowershellを使用していますが、Dockerのバージョンは17.12.0-ce, build c97c6d6
。どうして?
それを壊すのは、おそらくWindowsスタイルの行末です。 Windowsの行末で保存した場合のファイルは次のようになりますが、Unixスタイルで読み取ります。
#!/bin/sh^M
^M
echo "hello world"^M
シバン(#!)を解釈すると、exec
は余分な改行(CR
、\r
、^M
と表示)を表示し、/bin/sh^M
を見つけることができません。
$ exec ./setup.sh
bash: setup.sh: /bin/sh^M: bad interpreter: No such file or directory
Unixスタイルの行末でファイルを保存します。 Windowsでは、まともなテキストエディター(Sublime Text、Notepad ++、任意のIDEなど)で実行できるはずです。 dos2unixと呼ばれるシンプルなコマンドラインツールもあり、期待どおりの動作をします。
アルパインイメージはbusybox
を使用し、 busyboxにはシェルがありません は、実際には人間向けではないためです。
ご参考までに
CMD ["/setup.sh"]
沿って:
CMD /bin/busybox ls -al /bin
あなたが得る:
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
また、/lib
同様に、busybox
はmusl
ではなくglibc
を使用しているため、通常のライブラリが存在しないことがわかります。
通常、setup.sh
とにかくDockerfileのRUN
命令で実行する必要がありますか?
PS:ちなみに、
standard_init_linux.go:195: exec user process caused "no such file or directory"
実行可能ファイルが見つからないか、必要なライブラリの1つが見つからないため、Dockerfileのデバッグが非常に困難になります。