dockerでスクリプトファイルを実行できません。そのファイルやディレクトリはありません。

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

答え1

たぶんWindowsスタイルの行末が壊れている可能性があります。 Windows行の末尾に保存しましたが、Unixスタイルで読み取ったときのファイルの外観は次のとおりです。

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

shebang(#!)を解釈すると、追加の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という単純なコマンドラインツールもあります。

答え2

これアルパイン画像の使い方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

しかも同じように見れば。代わりにuseを使用している/libため、一般的なライブラリがないことがわかります。busyboxmuslglibc

通常、何をしてもsetup.shDockerfileの指示に従って実行する必要がありますか?RUN

PS:ところで、

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

実行可能ファイルが見つからないか、必要なライブラリの1つが見つからないという意味なので、Dockerfileのデバッグは非常に困難です。

答え3

ビジボックスコンテナの代わりにCMDまたはEntrypoint ["/bin/sh","/setup.sh"](または)を配置してください。["/bin/ash","/setup.sh"]["/setup.sh"]

答え4

Windowsの代わりにUnixスタイルの行末を使用する必要があります。 Windows 10でもこの問題が発生します。

リポジトリを複製する前に、次のコマンドを実行する必要があります。

git config --global core.autocrlf false

その後、リポジトリを複製して続行します。

関連情報