Docker ComposeをCronで実行しないといけない場合がある。
たとえば、手動実行のLet's Encryptなど
- 10 Docker Let's Encrypt
- 33 Let's Encrypt リバースプロキシ(手動板)+ GitLab
シェルスクリプトで実行しないと上手く動作しないので、シェルスクリプトを用意
※「-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
- TTYが割り当てられない: docker-compose run コマンドで -T オプションを使用すると、疑似端末が割り当てられません。これにより、コマンドは非対話的なモードで実行されます。
- 出力の処理: TTYが割り当てられていない場合、コマンドの標準出力と標準エラー出力が直接ログファイルにリダイレクトされるため、出力がログに記録されやすくなります。Cronジョブは非対話的な環境で実行されるため、TTYが必要ない状況で -T オプションを使用することは理にかなっています。
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