我们有一些带有自定义 docker 镜像的 dockerized PHP 应用程序,以便 PHP mail() 函数能够真正发挥作用。
当我们构建映像时,我们会在构建时将证书复制到映像中。这很有效……持续 90 天。
为了更新,我们必须关闭 Web 应用程序,手动更新 LetsEncrypt,然后重建并使用新证书重新部署新映像。
我觉得我应该能够使用命名容器来做到这一点,以便自动更新,但我无法理解它。
有人有这个实用的剧本吗?
答案1
最终的答案是:使用命名卷,并添加一个脚本,将证书从 docker 主机复制到本地磁盘上的卷中。它的工作原理如下:
- 创建一个命名卷,并将其挂载到
/certs
。 - 确保 Apache 使用位于您的站点配置文件中的证书。
- 设置 cert-bot 自动续订来自主持人,并使用预挂钩关闭你的 docker 实例。
- 在 cert-bot 更新证书后,使用 post-hooks 运行脚本将新铸造/更新的证书从 /etc/letsencrypt/live/foosite.com/(或类似文件)复制到卷位置 - 覆盖那里的内容。
最后一步需要一点努力。首次创建命名卷后,您必须使用docker volume ls
和docker volume inspect
找出该卷在主机文件系统上维护的位置。它通常位于 /var/lib/docker 下的某个位置。
上面步骤#4中的后挂钩脚本只是将证书从实时目录直接复制到此docker卷,然后重新启动容器。