次の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
ため、一般的なライブラリがないことがわかります。busybox
musl
glibc
通常、何をしてもsetup.sh
Dockerfileの指示に従って実行する必要がありますか?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
その後、リポジトリを複製して続行します。