Docker: コンテナ内の標準出力の表示 – logs

Dockerサブコマンドの一つである、logsはコンテナ内プロセスの標準出力及び標準エラー出力を表示する。

Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
-f, –follow=false Follow log output
<後略>

使用例

例として、下記のDockerfileで構築したコンテナの標準出力を確認する。当該Dockerfileは一つ誤りがあり、ビルドは成功しても実行時にエラーとなる。

FROM centos:centos7
RUN yum -y install httpd
CMD service httpd start && bash

イメージのビルド

ここでは、build_httpdディレクトリに保管した上記のDockerfileをビルドする際、-tオプションを用いて「リポジトリー名:タグ名」をyuukun/httpd:ver1.1と指定している。

$ docker build -t yuukun/httpd:ver1.1 /vagrant/build_httpd
<中略>
Successfully built a248e7f50217

コンテナの実行

作成したイメージにweb01の名前を付け、ポート80をホストOS側の80番に紐づけて起動する。オプション-itで擬似端末への標準出力設定となり、-dでバックグラウンド起動となる。

$ docker run -itd -p 80:80 --name web01 yuukun/httpd:ver1.1
b738592e4c8a3817c590c51d768e552ab402df865124ae24611e8e4c80c13353

参考) 公式ドキュメント – run

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
Run a command in a new container
-d, –detach=false Run container in background and print container ID
-i, –interactive=false Keep STDIN open even if not attached
-t, –tty=false Allocate a pseudo-TTY

その後、下記のコマンドでstatusを確認するがExited (127)で異常終了している。

$ docker ps -l
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                        PORTS               NAMES
b738592e4c8a        yuukun/httpd:ver1.1   "/bin/sh -c 'service "   16 seconds ago      Exited (127) 15 seconds ago                       web01

docker logsによる標準出力の確認

ここで、下記の通りコンテナ名を引数にdocker logsコマンドを使用すると、標準エラー出力が分かる。

$ docker logs web01
/bin/sh: service: command not found

結果として、CentOS7上では既にserviceコマンドが廃止されている為、command not foundエラーが発生し&&以降のbashが起動せずに異常終了したことが分かる。

補足

では仮に下記の通り、Dockerfileを下記の通り修正した場合は上手くいくかと言うと、別種のエラーが発生する。

CMD systemctl start httpd.service && bash

Failed to get D-Bus connection: Operation not permittedエラー

$ docker run -itd -p 80:80 --name web01 yuukun/httpd:ver1.1
3de8195fa869b8507105d35b0fbd3249ae884f6f35d821494aea8efe4349d106
$ docker logs web01
Failed to get D-Bus connection: Operation not permitted
$

当該エラーに関わる対処法については下記のサイトに記述があるが、何れもDockerfile上でサービスの立ち上げまでは実現できてない。コンテナの起動後にコンテナを操作してサービスの立ち上げを実施している。この場合、Dockerfileのメリットを活かせていないので、使用コンテナをCentOS 6に変更するという考え方もある。