web-dev-qa-db-ja.com

Dockerコンテナーのログを正しく消去する方法

特定のコンテナのログを見るためにdocker logs [container-name]を使います。

これらのログを消去するためのエレガントな方法はありますか?

108
Youssouf Maiga

から この質問 あなたが実行できるワンライナーがあります:

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

私はDockerのファイルを直接修正することは大好きではありません。 Dockerに自動的にログをローテーションさせることができます。デフォルトの JSONロギングドライバ を使用している場合、これはdockerdへの追加のフラグで行われます。

dockerd ... --log-opt max-size=10m --log-opt max-file=3

起動スクリプトを変更する代わりに、これを daemon.json ファイルの一部として設定することもできます。

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

このファイルを変更した後は、必ずsystemctl reload dockerを実行して設定を適用してください。この設定は、新しく作成されたコンテナのデフォルトになります。新しいログ制限を受け取るには、既存のコンテナーを削除して再作成する必要があります。

148
BMitch

つかいます:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

参照:ファイルの使用中にファイルを切り捨てる(Linux)

139
duketwo

ログを定期的に消去するようにlogrotateを設定できます。

/etc/logrotate.d/docker-logs内のファイル例

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}
21
AlexPnt
Sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
21
richard

Dockerコマンドを使って直接これを行うことはできません。

ログのサイズを制限するか、スクリプトを使用してコンテナに関連するログを削除することができます。ここにスクリプトの例があります(下から読んでください):機能:ログ履歴をクリアする機能#1083

Docker-composeファイルリファレンスの loggingセクション を確認してください。ここでは、一部のロギングドライバのオプション(ログローテーションやログサイズ制限など)を指定できます。

9
Tristan

2018ソリューションDocker4Mac

LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=Host Alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH

最初の行は、受け入れられた回答と同様に、ログファイルのパスを取得します。

2行目では、nsenterを使用して、Docker4Macのすべてのdockerコンテナのホストとしてそのサーバーをxhyve VMで実行できます。私たちが実行するコマンドは、Mac以外の回答からのおなじみのtruncate -s0 $LOGPATHです。

docker-composeを使用している場合、最初の行は次のようになります。

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

そして<service>はあなたのdocker-compose.ymlファイルからのサービス名です。

https://github.com/justincormack/nsenter1nsenterトリックに感謝します。

8
gooli

root ユーザーとして、次のコマンドを実行してください。

>  /var/lib/docker/containers/*/*-json.log

または

cat /dev/null > /var/lib/docker/containers/*/*-json.log

または

echo "" > /var/lib/docker/containers/*/*-json.log
4
matson kepson

Ubuntuサーバーでは、SudoでもCannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directoryを取得します

しかし、ドッカーの検査と切り捨ての回答を組み合わせるとうまくいきました:

Sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
2
aqwan

Windows上のDocker、そしておそらく他のものでも、tailオプションを使うことが可能です。

例えばdocker logs -f --tail 100 msftmodbus

このように、最後の100行だけが表示され、あなたは最初に1M行をスクロールする必要はありません…

(したがって、ログの削除はおそらく不要です)

2
Egbert Nierop

MacユーザーのためのDocker、これが解決策です:

    1. 次の方法でログファイルのパスを見つけます。

      $ docker inspect | grep log

    1. Docker machineにSSHで接続します(名前がdefaultであると仮定します。そうでない場合は、docker-machine lsを実行して確認します)。

      $ docker-machine ssh default

    1. Rootユーザーに変更します( reference ):

      $ Sudo -i

    1. ログファイルの内容を削除します。

      $ echo "" > log_file_path_from_step1

0
Jinsong Li