web-dev-qa-db-ja.com

Dockerでスクリプトファイルを実行できません。そのようなファイルまたはディレクトリはありません

私はこのような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。どうして?

6
Cris

それを壊すのは、おそらく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と呼ばれるシンプルなコマンドラインツールもあり、期待どおりの動作をします。

11
Norrius

アルパインイメージは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同様に、busyboxmuslではなくglibcを使用しているため、通常のライブラリが存在しないことがわかります。

通常、setup.shとにかくDockerfileのRUN命令で実行する必要がありますか?

PS:ちなみに、

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

実行可能ファイルが見つからないか、必要なライブラリの1つが見つからないため、Dockerfileのデバッグが非常に困難になります。

2
xenoid