web-dev-qa-db-ja.com

Docker Alpineコンテナでシェルを起動する

Ubuntuイメージ用の対話型シェルを起動するには、次のように実行します。

ole@T:~$ docker run -it --rm ubuntu
root@1a6721e1fb64:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

しかし、これを Alpine Dockerイメージ に対して実行すると、次のようになります。

ole@T:~$ docker run -it --rm Alpine
Error response from daemon: No command specified

Alpineベースコンテナでインタラクティブシェルを起動するためのコマンドは何ですか?

105
Ole
ole@T:~$ docker run -it --rm Alpine /bin/ash
(inside container) / # 

上記で使用されたオプション:

  • /bin/ashは、BusyBoxが提供するAsh( Almquist Shell )です。
  • --rm終了時にコンテナを自動的に削除します(docker run --help
  • -i対話モード(接続されていなくてもSTDINを開いたままにしておく)
  • -t擬似TTYを割り当てます
196
Ole

通常、Alpine Linuxイメージにはbashは含まれていませんが、代わりに/bin/ash/bin/shashまたはshのみを使用できます。

/ bin/ash

docker run -it --rm Alpine /bin/ash

/ bin/sh

docker run -it --rm Alpine /bin/sh

docker run -it --rm Alpine ash

sh

docker run -it --rm Alpine sh

この情報がお役に立てば幸いです。

51
jansanchez

今日では、アルパインイメージはデフォルトで/bin/shから直接起動します。実行するシェルを指定する必要はありません。

$ Sudo docker run -it --rm Alpine  
/ # echo $0  
/bin/sh  

これは、Alpine image Dockerfilesに CMD コマンドが含まれているためです。これは、コンテナの起動時に実行するシェルを指定します:CMD ["/bin/sh"]

DockerがCMD用の追加のレイヤーを作成するためにイメージサイズが大きくなるため、古いアルパインイメージバージョン(2017年以前)では、CMDコマンドは使用されていませんでした。これはアルパインの画像開発者が避けたかったことです。最近のDockerバージョン(1.10以降)では、CMDはレイヤーを占有しなくなったため、Alpineイメージに追加されました。したがって、CMDが上書きされない限り、最近のアルパインイメージは/bin/shで起動します。

参考のために、Glider Labsによる公式Alpine Dockerfilesへの次のコミットを参照してください。
https://github.com/gliderlabs/docker-Alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a96578d4900cb5b

10
valiano