web-dev-qa-db-ja.com

実行中のDockerコンテナーからファイルと標準出力を読み取る方法

実行中のdockerコンテナからファイルとstdoutを読み取るために、ホストマシンでアプリケーションを起動するにはどうすればよいですか?

基本的に私はこれをやりたい:

docker start containerid   
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared. 

それをどうやってやるの?これをどこに行こうとしているのかをより具体的にするために。 Dockerコンテナのログと標準出力を読み取り、それらのログを別の場所で処理したい。

また、別のコンテナーからファイルと標準出力を読み取ることができる別のドッカーコンテナーを作成することもできますが、それが可能かどうかはわかりません。

69
rexposadas

Dockerコンテナによって開始されたプロセスのstdoutは、 docker logsコマンド (use -fそれを永遠に続けるために)。もう1つのオプションは、 docker remote API を介してログを直接ストリーミングすることです。

ログファイルにアクセスする場合(必要な場合のみ、stdoutまたはsyslogdなどの他の標準ソリューションへのロギングを検討してください)、唯一のリアルタイムオプションは ボリュームの構成 (Marcus Hughesが示唆するように)であり、ログが保存されますコンテナの外部にあり、ホストまたは別のコンテナから処理できます。

ログにリアルタイムでアクセスする必要がない場合は、 ファイルをエクスポートできます (tar形式で)docker export

104
Abel Muiño

標準出力を表示するには、-iを使用してdockerコンテナーを起動できます。もちろん、これにより、開始したプロセスを終了してコンテナを探索することはできません。

docker start -i containerid

または、次の場所でコンテナのファイルシステムを表示できます。

/var/lib/docker/containers/containerid/root/

ただし、これらのどちらも理想的ではありません。ログまたは永続ストレージを表示する場合、正しい方法は、-vを使用するときにdocker runスイッチを使用して ボリュームを接続 にすることです。つまり、ホスト上のログファイルを検査するか、別のコンテナーに添付して検査することができます。

16
Marcus Hughes

コンテナのファイルシステムを表示できます

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

そしてあなたはただできる

tail -f mylogfile.log
4
maestr0

Dockerコンテナとホストシステム間、または個別のコンテナ間でファイルを共有するには、 volumes を使用するのが最適です。

アプリを別のコンテナで実行することは、おそらくアプリケーション全体を適切に分離して簡単に展開できるため、最良のソリューションです。あなたがやろうとしていることは、 この優れたブログ投稿 で説明されている設定に非常に近いように聞こえます。

3
Jules Olléon

少し遅れましたが、これは私がjournaldでやっていることです。とても強力です。

OSでsystemd-journaldを使用してdockerコンテナを実行する必要があります。

docker run -d --log-driver=journald myapp

これにより、全体がHostのjournaldにパイプされ、ログのプルーニング、ストレージ形式などの処理が行われ、それらを表示するためのクールなオプションが提供されます。

journalctl CONTAINER_NAME=myapp -f

ログに記録されると、コンソールにフィードされます。

journalctl CONTAINER_NAME=myapp > output.log

これにより、ファイル内のすべてを削除することができます。または

journalctl CONTAINER_NAME=myapp --since=17:45

さらに、希望する場合は、docker logs ....を介してログを表示できます。

これ以上> my.logまたは-v "/apps/myapp/logs:/logs"などはありません

2
Adam