実行中のdockerコンテナからファイルとstdoutを読み取るために、ホストマシンでアプリケーションを起動するにはどうすればよいですか?
基本的に私はこれをやりたい:
docker start containerid
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared.
それをどうやってやるの?これをどこに行こうとしているのかをより具体的にするために。 Dockerコンテナのログと標準出力を読み取り、それらのログを別の場所で処理したい。
また、別のコンテナーからファイルと標準出力を読み取ることができる別のドッカーコンテナーを作成することもできますが、それが可能かどうかはわかりません。
Dockerコンテナによって開始されたプロセスのstdoutは、 docker logs
コマンド (use -f
それを永遠に続けるために)。もう1つのオプションは、 docker remote API を介してログを直接ストリーミングすることです。
ログファイルにアクセスする場合(必要な場合のみ、stdoutまたはsyslogdなどの他の標準ソリューションへのロギングを検討してください)、唯一のリアルタイムオプションは ボリュームの構成 (Marcus Hughesが示唆するように)であり、ログが保存されますコンテナの外部にあり、ホストまたは別のコンテナから処理できます。
ログにリアルタイムでアクセスする必要がない場合は、 ファイルをエクスポートできます (tar形式で)docker export
で
標準出力を表示するには、-i
を使用してdockerコンテナーを起動できます。もちろん、これにより、開始したプロセスを終了してコンテナを探索することはできません。
docker start -i containerid
または、次の場所でコンテナのファイルシステムを表示できます。
/var/lib/docker/containers/containerid/root/
ただし、これらのどちらも理想的ではありません。ログまたは永続ストレージを表示する場合、正しい方法は、-v
を使用するときにdocker run
スイッチを使用して ボリュームを接続 にすることです。つまり、ホスト上のログファイルを検査するか、別のコンテナーに添付して検査することができます。
コンテナのファイルシステムを表示できます
/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/
そしてあなたはただできる
tail -f mylogfile.log
Dockerコンテナとホストシステム間、または個別のコンテナ間でファイルを共有するには、 volumes を使用するのが最適です。
アプリを別のコンテナで実行することは、おそらくアプリケーション全体を適切に分離して簡単に展開できるため、最良のソリューションです。あなたがやろうとしていることは、 この優れたブログ投稿 で説明されている設定に非常に近いように聞こえます。
少し遅れましたが、これは私が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"
などはありません