Docker 在构建期间发布端口

Docker publish ports during build

我正在使用 Docker 构建 nginx 环境。我想知道是否可以在构建期间公开发布端口 (80、443),以便 letsencrypt 可以 运行 在构建时(它需要网络访问(中间)容器中的服务器)。

这可能吗?

我从未见过,我认为这是不可能的设计。

  • 你不应该把密钥放在图像中
  • 您可能需要在 2 个月后重新确保许可证,并且需要重建整个映像

一般来说,这是使用配套的 letsencrypt docker 图像完成的,有时称为 sidekick。你基本上有你的应用程序(及其容器)和一个 letsencrypt 容器,暴露一个卷,然后 nginx 使用 volume_from 安装这个卷是 letsencrypt 容器放置获取的证书。这发生在映像启动期间,而不是映像创建期间。您使用 docker-compose 文件来配置任何需要的东西。

例如你可以在这里看看 一)https://github.com/rancher/community-catalog/blob/master/templates/letsencrypt/2/docker-compose.yml b) 或 http://letsencrypt.readthedocs.io/en/latest/using.html#running-with-docker

a) 允许您使用 ENV 变量定义您将需要的域,这将非常适合 docker-compose 方式,不提供任何文件,如主机上的配置(保持可移植性).

您仍然可以将所有这些放在 nginx-server 上,但出于多种原因(例如需要配置 nginx),这不是最佳实践。


如果你想坚持使用 "build time",另一种方法是使用 DNS 验证模式,所以不是使用端口上的回连验证,而是使用 DNS 条目验证,一些链接用于那 - https://github.com/lukas2511/letsencrypt.sh/wiki/Examples-for-DNS-01-hooks - a) 容器执行此操作

对于这种情况,您可能想要选择 http://cloudflare.com - 据我所知,它是唯一可以免费 API 访问无限域的 DNS 服务,其他任何服务要么收费,要么有限制。