目次

2024.08.31 Docker ComposeのCron実行

Docker ComposeをCronで実行しないといけない場合がある。
たとえば、手動実行のLet's Encryptなど

- 10 Docker Let's Encrypt
- 33 Let's Encrypt リバースプロキシ(手動板)+ GitLab

やり方

1.シェルを用意

シェルスクリプトで実行しないと上手く動作しないので、シェルスクリプトを用意

※「-T」オプションが重要です。

/usr/local/bin/renew_ssl_certificate.sh

#!/bin/bash

echo $(date)
cd /app
docker-compose run --rm -T certbot renew
docker-compose exec -T nginx nginx -s reload

-Tオプションの意味

- TTYが割り当てられない: docker-compose run コマンドで -T オプションを使用すると、疑似端末が割り当てられません。これにより、コマンドは非対話的なモードで実行されます。

- 出力の処理: TTYが割り当てられていない場合、コマンドの標準出力と標準エラー出力が直接ログファイルにリダイレクトされるため、出力がログに記録されやすくなります。Cronジョブは非対話的な環境で実行されるため、TTYが必要ない状況で -T オプションを使用することは理にかなっています。

2.crontab

crontabでは、ログファイルへリダイレクトを書いておくことによって実行ログが保存されます。

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
8 5 * * * renew_ssl_certificate.sh >> /var/log/certbot.log 2>&1