@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

Dockerコンテナ(Let's Encryptのcertbot)を定期的に再起動する

tl;dr

entrypointにwhile sleepを仕込めばよかった

entrypoint: /bin/sh -c "trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;"

背景など

docker-composeでapacheコンテナとcertbotを組み合わせて、cerbotの証明書出力先をapacheコンテナにvolumeでマウントしていた。

更新するときは今のところ手動でcertbot renewをキックする操作が必要だった(docker-compose run cerbot renewのような)

せっかくコンテナに押し込んでいるのに、ホストのcrontabを使うのは嫌だったので探したら見つかった。

superuser.com

entrypoint: /bin/sh -c "trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;"

これはTERMシグナルがきたら終了するのを設定して(trap exit TERM)、12時間おきにcertbot renewを実行している。(なんでバックグラウンドで実行してから待っているのかわからないけど、trapをいい感じに発動するためだろうか?

上記記事ではnginxを再起動しているが、同様にapacheコンテナもこんな感じで設定再読み込みすれば良い

command: /bin/sh -c "while :; do sleep 6h & wait $${!}; kill -USR1 1; done & httpd-foreground;'"

これはPID 1にシグナル1を渡せばプロセスが再起動するのを利用している。

dev.to

パッと見わかりにくいが、6時間おきに再起動する無限ループをバックグラウンドにセットして(while :; do sleep 6h & wait $${!}; kill -USR1 1; done &)、通常の起動処理(httpd-foreground)を実行している。