回答:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
または、同様の切り捨てコマンドがあります:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
私はどちらもDockerのファイルを直接変更するので、どちらも大して好きではありません。外部ログの削除は、DockerがJSON形式のデータをファイルに書き込んでいるときに発生する可能性があり、その結果、行が部分的になり、docker logs
CLI からログを読み取ることができなくなります。
代わりに、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"}
}
これらのオプションは、rootアクセスで構成する必要があります。systemctl reload docker
このファイルを変更して設定を適用した後で、必ずを実行してください。この設定は、新しく作成されたコンテナのデフォルトになります。新しいログ制限を受け取るには、既存のコンテナを削除して再作成する必要があることに注意してください。
同様のログオプションを個々のコンテナーに渡してこれらのデフォルトを上書きすることができるため、個々のコンテナーで保存するログの数を増減できます。これからdocker run
次のようになります:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
またはコンポーズファイルで:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
さらにスペースを節約するために、jsonログドライバーから「ローカル」ログドライバーに切り替えることができます。同じmax-sizeオプションとmax-fileオプションを使用しますが、jsonに格納する代わりに、より高速で小さいバイナリ構文を使用します。これにより、同じサイズのファイルにより多くのログを保存できます。そのためのdaemon.jsonエントリは次のようになります。
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
ローカルドライバーの欠点は、jsonログへの直接アクセスに依存していた外部ログパーサー/フォワーダーが機能しなくなることです。そのため、filebeatなどのツールを使用してElasticまたはSplunkのユニバーサルフォワーダーに送信する場合、「ローカル」ドライバーは避けます。
ヒントとテクニックのプレゼンテーションで、これについてもう少し詳しく説明します。
service docker restart
それだけではうまくいかないことをしました。また、それが有効になる前に、新しいコンテナをブランド作成する必要がありました。つまり、古いコンテナを起動しただけでは新しいロギングが適用されませんでした
echo -n > ...
。とにかく、自分のログをより詳細に制御できるようにしたいと考えています。たとえば、docker-composeの再起動後、保存されたログを使って何かを行うメカニズムが欲しいです。
使用する:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
あなたはsudoが必要かもしれません
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
ref。Jeff S. Dockerコンテナーのログを適切にクリアする方法は?
リファレンス:使用中のファイルの切り捨て(Linux)
containers
あります。それ以外の場合、コンテンツは利用できません。
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
-私のために働いた
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
WindowsとMac用のDocker、そしておそらく他のものでも、tailオプションを使用することが可能です。例えば:
docker logs -f --tail 100
この方法では、最後の100行のみが表示され、最初に100万行をスクロールする必要はありません...
(したがって、ログの削除はおそらく不要です)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
合計のみを取得するにはsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
logrotateを設定して、定期的にログをクリアできます。
/etc/logrotate.d/docker-logsのサンプルファイル
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
か?ファイル/etc/logrotate.d/docker-logs
が存在しません。作成する必要がありますか?
"log-opts"
BMitchが示すとおり)
Docker4Mac、2018ソリューション:
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
、xhyve
Docker4MacのすべてのDockerコンテナーのホストとして機能するVMでコマンドを実行できるようにしています。私たちが実行するコマンドは、truncate -s0 $LOGPATH
Mac以外の回答でおなじみです。
を使用しているdocker-compose
場合、最初の行は次のようになります。
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
そして<service>
、あなたからのサービス名であるdocker-compose.yml
ファイル。
トリックのためのhttps://github.com/justincormack/nsenter1に感謝しますnsenter
。
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
Dockerコマンドを使用してこれを直接行うことはできません。
ログのサイズを制限するか、スクリプトを使用してコンテナに関連するログを削除できます。ここでスクリプトの例を見つけることができます(下から読んでください):機能:ログ履歴をクリアする機能#1083
一部のロギングドライバーのオプション(ログローテーションやログサイズの制限など)を指定できるdocker-composeファイルリファレンスのロギングセクションを確認してください。
次のdocker run
ように、コマンドラインでlog-optsパラメータを指定することもできます。
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
またはこのようなdocker-compose.ymlで
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
クレジット:https : //medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412(James Quigley)
"5"
すると、動作します。10m
確かに引用せずに作業。
MacユーザーのためのDocker、これが解決策です:
次の方法でログファイルのパスを検索します。
$ docker inspect | grep log
DockerマシンにSSHで接続します(名前がdefault
である場合は、実行docker-machine ls
して確認します)。
$ docker-machine ssh default
rootユーザーに変更します(参照):
$ sudo -i
ログファイルの内容を削除します。
$ echo "" > log_file_path_from_step1
docker exec -it default sh
コンテナにshシェルを入力するために使用できます。ただし、多くのコンテナーは、sudo
コマンドを暗黙的に使用可能にしません。
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"