※この記事はUdon Advent Calendar 2024 - Adventarの18日目の記事です。
はじめに
こんにちは。Udonです。
最近はDockerを使うことが多いのですが、エラーが発生したときになんでなのかわからず悩んでしまうことが多かったです。
エラーの解決の近道はログを確認することです。今回はDockerのログを確認する方法を書いていこうと思います。
テスト用のコンテナを作る
以下のリポジトリにテスト用の領域を作りました。
クローンして、「Docker-Log」というディレクトリに入り、以下のコマンドを実行します。
docker-compose up -d
こうすることで、以下のPythonのコードが実行されます。
def main():
for i in range(1,11):
print(i)
if __name__=="__main__":
main()
つまり、1から10までの数字を表示するだけです。
しかし、先ほど-d
オプションをつけているので、バックグラウンドで実行されます。なのでこの出力は目に見えないわけです。
ログを確認する
ログを確認するには以下のコマンドを実行します。
docker logs [コンテナID]
コンテナIDは以下のコマンドで確認できます。
docker ps -a
そうすると、以下のようなログが表示されます。
1
2
3
4
5
6
7
8
9
10
これでログを確認することができました。ちなみに、-f
オプションをつけることで、ログの追跡をすることができます。つまり、実行時のログをリアルタイムで確認することができるというわけです。オプションなしだと、そのときまでのログが表示されます。
また、エラーログとそれ以外を区別することもできます。前者はエラーログのみを表示し、後者はエラーログ以外を表示します。
docker logs [コンテナID] 1>/dev/null
docker logs [コンテナID] 2>/dev/null
dev/null
にリダイレクトすると、どこにも出力されず、無に消えることになります。
ちなみに、docker-compose
を使っている場合は、以下のコマンドでログを確認することができます。
docker-compose logs
出力は以下のようになります。IMAGE名が表示されていますね。
docker-log-test-1 | 1
docker-log-test-1 | 2
docker-log-test-1 | 3
docker-log-test-1 | 4
docker-log-test-1 | 5
docker-log-test-1 | 6
docker-log-test-1 | 7
docker-log-test-1 | 8
docker-log-test-1 | 9
docker-log-test-1 | 10
この方法ではコンテナIDを指定する必要はないですが、エラーログとそれ以外を区別することはできません。
ログを保存する
以下のように、適当な保存先を用意しておけばログをリダイレクトによって保存することができます。
docker logs [コンテナID] > [保存先のパス]
追記する場合は以下のようにします。
docker logs [コンテナID] >> [保存先のパス]
ログのリセット
ログはdocker compose down
を実行し、もう一度docker compose up -d
を実行するとリセットされます。これはコンテナが再起動されるためです。
おわりに
これでDockerのログを確認することができるようになりました。
DockerでDiscord Botを動かしたりしていると、エラーが発生してもなぜエラーになるのかわかりづらいときがあります。そんな時にログを確認すれば、エラーの原因究明に役立ちます。
ではこの記事は以上です。また明日の記事でお会いしましょう。