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を使うのは嫌だったので探したら見つかった。
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を渡せばプロセスが再起動するのを利用している。
パッと見わかりにくいが、6時間おきに再起動する無限ループをバックグラウンドにセットして(while :; do sleep 6h & wait $${!}; kill -USR1 1; done &
)、通常の起動処理(httpd-foreground
)を実行している。