69251

[code]

    % docker run ubuntu
    
[/code]

このように ubuntu のコンテナを立ち上げても、コンテナは起動せず（もしかしたら起動して直ちに停止しているのかもしれないけど、上記コマンド直後に
`docker ps` しても立ち上がっている形跡はなし）、ditオプションを付けて下記のようにすると立ち上げっていました。

[code]

    docker run -dti ubuntu
    
[/code]

おそらく、`ti`による仮想端末からの入力がないと立ち上がらないのではないかと推測してるのですが、そういうもの（仕様）なのでしょうか？
dtiオプションを付けなくても起動し、その後 `docker exec -it コンテナID /bin/sh`
とすれば接続できると思っていたのですが、起動しないので接続しようがありませんでした。

とくに接続できないから困っているということではなく、dtiを付けないといけないのに気づかないで少しハマったので気になりました。

ちなみに試しに `docker run -d ubuntu` と
dのみでも立ち上がりませんでした。厳密に言うと、dのみの場合は実行後、コンテナIDが出力されたが、`docker
ps`しても起動していないことが確認できた。

なので、もしかしたら  
`docker run ubuntu` は、そもそも起動しない。  
`docker run -d ubuntu`は、起動した直後に停止している。  
と推測してます。


CC BY-SA 4.0
2020-08-03T13:55:56.337
69217
2020-08-04T19:35:37.787
2020-08-03T22:03:48.250
9008
9008
question
docker
ubuntuイメージ dtiオプションを指定しないと立ち上がらない


[`docker ps`
コマンド](https://docs.docker.jp/engine/reference/commandline/ps.html)に `-a`
オプションを付与すれば、全てのコンテナを表示できます。

実行すると、例えば次のような出力が得られます。

[code]

    $ docker run ubuntu
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    16963909a68b        ubuntu              "/bin/bash"         2 seconds ago       Exited (0) 2 seconds ago                       festive_roentgen
    
[/code]

ここから `/bin/bash` が実行されていることがわかります。  
また、 `/bin/bash` は終了コード `0` で終了していることもわかります。  
`/bin/bash` が終了したのでコンテナが停止しています。

* * *

[`docker run`
コマンド](http://docs.docker.jp/engine/reference/commandline/run.html) の `-i`
オプション(コンテナの STDIN にアタッチ)を付与することでこの `/bin/bash` をインタラクティブモードで起動できます。

[code]

    $ docker run -i ubuntu
    
[/code]

`exit`コマンド入力で`/bin/bash`は終了します。  
終了すると(`-i`を付与しなかった場合と同様)コンテナは停止します。

* * *

`docker run ubuntu` コマンドを実行した場合に起動されるコンテナイメージは

<https://hub.docker.com/_/ubuntu> から辿れる
[`Dockerfile`](https://github.com/tianon/docker-brew-ubuntu-
core/blob/3d44d0b838eeb78c5baee976a4a529976b326878/focal/Dockerfile)
によって生成されていますが、[最下部](https://github.com/tianon/docker-brew-ubuntu-
core/blob/3d44d0b838eeb78c5baee976a4a529976b326878/focal/Dockerfile#L42)の[`CMD`](https://docs.docker.jp/engine/reference/builder.html#cmd)命令

[code]

    CMD ["/bin/bash"]
    
[/code]

で指定されている `/bin/bash` が、コンテナ実行時にデフォルトで行われる処理です。

* * *

例えば、

[code]

    $ cat > Dockerfile << EOF
    from ubuntu
    CMD ["uname", "-a"]
    EOF
    $ docker build -t ubuntu-uname .
    
[/code]

というようなDockerイメージを作成し、

[code]

    $ docker run ubuntu-uname
    
[/code]

を実行すれば、`uname -a` が実行され、終了します。  
`/bin/bash`とは異なり `-i` オプションを付与しても挙動は同じです(`uname`はSTDINを考慮しません)。

[code]

    $ docker run -i ubuntu-uname
    
[/code]

* * *

まとめると、

  * `docker run ubuntu` コマンドによってコンテナは起動していますがその後終了しています。
  * `docker run` に `-i` オプションを付与するとコンテナが起動したままになるのは `/bin/bash` が終了しないからです。


CC BY-SA 4.0
2020-08-04T19:35:37.787
69251
2020-08-04T19:35:37.787
2808
69217
answer