Docker构建期间发布端口

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

你真的不想把证书放进镜像里 ;) - Auzias
1
我同意,如果你要发布这个镜像的话。不过,使用数据容器可能更有意义。但我仍然可以想象出在构建期间发布端口或将任何Docker运行选项传递给使用构建的中间容器的用例是有用的。 - Sven van de Scheur
我在谈论证书,而不是设置发布端口。现在...假设Docker镜像可以强制使用特定端口(在构建时设置)。如果我已经在此特定端口上运行服务,或者此特定端口被防火墙阻止,我该怎么办?在我看来,所有服务都应该允许更改默认端口。 - Auzias
如果我已经在特定端口上运行了一个服务怎么办?或者如果这个特定端口被防火墙阻止了怎么办?和docker run命令一样吗? - Sven van de Scheur
@SvenvandeScheur,你找到在镜像构建时生成证书的解决方案了吗?我也遇到了同样的情况。我尝试使用docker-compose并添加certbot服务来生成和验证证书。但是,它必须绑定到与Web服务器服务端口相同的0.0.0.0:80端口,这会导致端口冲突。 - Stoyan Dimov
1个回答

3
我从未见过这样的情况,我认为这是不可能的设计。
  • 您不应将秘密密钥放在图像中
  • 您可能需要在2个月后重新确认许可证,并需要重建整个映像
一般来说,这是使用 companion letsencrypt docker image 完成的,有时称为 sidekick。您基本上有您的应用程序(及其容器)和一个 letsencrypt 容器,公开一个卷,nginx 然后使用 volume_from 挂载此卷,该卷是 letsencrypt 容器放置获取的证书的位置。这发生在映像启动期间,而不是在映像创建期间。您可以使用 docker-compose 文件配置任何所需内容。
例如,您可以在这里查看 a) 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)。
如果您想坚持“构建时间”,另一种选择是使用 DNS 验证模式,因此您可以使用 DNS 条目而不是通过端口进行验证。以下是一些链接 - https://github.com/lukas2511/letsencrypt.sh/wiki/Examples-for-DNS-01-hooks - a) 容器执行此操作
对于这种情况,您可能希望选择http://cloudflare.com - 据我所知,它是唯一具有免费 API 访问无限域名的 DNS 服务,其他任何东西都要花钱或有限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接