私は独自のbusyboxベースイメージを作成しようとしています。
# ./mkimage.sh -t pensu/busybox busybox-static
+ mkdir -p /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ tar --numeric-owner -caf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs.tar.xz -C /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs '--transform=s,^./,,' .
+ cat > '/var/tmp/docker-mkimage.US3tHy0uBQ/Dockerfile'
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ docker build -t pensu/busybox /var/tmp/docker-mkimage.US3tHy0uBQ
Sending build context to Docker daemon 863.2 kB
Sending build context to Docker daemon
Step 0 : FROM scratch
--->
Step 1 : ADD rootfs.tar.xz /
---> 8eac78bfc9d6
Removing intermediate container ad9bbb8f7536
Successfully built 8eac78bfc9d6
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ
Dockerリポジトリで画像が利用できることがわかります。
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
pensu/busybox latest 8eac78bfc9d6 7 seconds ago 2.476 MB
しかし、docker runを実行しようとすると、常にエラーが発生します。
# docker run -it pensu/busybox /bin/sh
exec: "/bin/sh": stat /bin/sh: no such file or directorytime="2015-04-09T16:03:45+05:30" level="fatal" msg="Error response from daemon: Cannot start container 8fe73b7832193c847d7975175a4be86d1f0b550b6a00b812bd4cdd18fe752468: exec: \"/bin/sh\": stat /bin/sh: no such file or directory"
なぜエラーが発生するのか理解できません。私は何か間違ったことをしていますか?他にどのようにして、動作状態の正しい画像を作成していることを検証できますか?
イメージを作成したら、次の方法で確認します。
$ docker inspect $image_name
cMDオプションの内容を確認してください。ビジーボックスの場合は、次のようになります。
"Cmd": [
"/bin/sh"
]
多分あなたはあなたの./mkimage.shのCMDオプションを上書きしています
次のコマンドを実行すると、このエラー(「stat/bin/bash:そのようなファイルまたはディレクトリはありません」)が発生しました。
docker exec -it 80372bc2c41e /bin/bash
解決策は、コンテナーで使用できるターミナル(またはシェル)の種類を識別することでした。そうするために、私は走った:
docker inspect 80372bc2c41e
そのコマンドの出力では、次のことがわかりました。
"Cmd": [
"/bin/sh",
"-c",
"gunicorn -b 0.0.0.0:7082 server.app:app"
],
これは、/bin/sh
コマンドが利用可能で、次のように接続できました:
docker exec -it 80372bc2c41e /bin/sh
このエラー
docker:デーモンからのエラー応答:OCIランタイムの作成に失敗しました:container_linux.go:348:コンテナープロセスを開始すると "exec:\"/bin/sh\":stat/bin/sh:no such file or directory":不明。
たとえば、ベースイメージからDockerイメージを作成するときに発生します。 scratch
。これは、結果の画像に画像を実行するためのシェルがないためです。使用する場合:
ENV EXECUTABLE hello
cmd [$EXECUTABLE]
dockerファイルでは、dockerは/ bin/shを使用して入力文字列を解析します。したがって、エラー。画像を検査すると、次のことがわかります。
$docker inspect <image-name>
"Entrypoint": [
"/bin/sh",
"-c",
"[$HM_APP]"
]
これは、ENTRYPOINTまたはCMD引数が/ bin/sh -cを使用して解析されることを意味します。私にとってうまくいった解決策は、コマンドを文字列のJSON配列として解析することです。
cmd ["hello"]
そして再び画像を検査します:
"Entrypoint": [
"hello"
]
これにより、/ bin/shへの依存がなくなり、Dockerアプリでバイナリファイルを実行できるようになります。例:
FROM scratch
# Environmental variables
# Copy files
ADD . /
# Home dir
WORKDIR /bin
EXPOSE 8083
ENTRYPOINT ["hospitalms"]
これが将来誰かを助けることを願っています。
私は同様の問題を抱えていました:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown.
私の場合、イメージが他の場所で機能し、ローカルイメージが破損していたことがわかっています。画像を削除する問題を解決しました(docker rmi <imagename>
)そして再びそれを引っ張ります(docker pull <imagename>
)。
docker system Prune
も必須ではありません。
実行しようとしているdockerファイルでubuntuのバージョンを明示的に言及し、
FROM ubuntu:14.04
FROM ubuntu:Latest
のように使用しないでください。これにより、上記の「コンテナを開始できません:stat/bin/sh:そのようなファイルまたはディレクトリはありません」の問題が解決しました
/ bin/shにシェルがありませんか?やってみました docker run -it pensu/busybox /usr/bin/sh
?