docker 构建 certbot 电子邮件输入

docker build certbot e-mail input

我正在尝试使用 docker build 启动一个网络应用程序。为了生成证书,我想使用 certbot。但是,如果我只是把

RUN certbot --nginx,

我明白了

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): Plugins selected: Authenticator nginx, Installer nginx
An unexpected error occurred:
EOFError.

有没有办法在 Dockerfile 中提供或忽略此信息?

RUN certbot -n -m ${EMAIL} -d ${DOMAINS} --nginx

我的一个建议是不要在 docker 构建期间执行此操作,而是在容器启动时生成证书。这是因为 letsencrypt 将尝试在您指定的域中连接到您的服务器,这可能不是您构建图像的地方。

虽然为了减少启动时间,您需要跳过 bootstrapping 依赖项(但您需要安装这些依赖项)。为此,我将在您的 Dockerfile 中使用以下命令列出证书(这将确保正确安装依赖项),然后更改 CMD(假设您使用的是 nginx 映像)

Docker 文件:

ARG EMAIL_ARG=defaultemail@example.com
ARG DOMAINS_ARG=example.com

ENV EMAIL=${EMAIL_ARG}
ENV DOMAINS=${DOMAINS_ARG}

RUN certbot --help
...
CMD ["sh", "-c", "certbot --no-bootstrap -n -m ${EMAIL} -d ${DOMAINS} --nginx", "&&", "nginx", "-g", "daemon off;"]

-n 用于非交互模式
--no-bootstrap 是跳过 bootstrapping 依赖项(安装 python 等)
-m 是指定用于重要通知的电子邮件
-d 是指定逗号分隔的域列表

使用 "sh",“-c”将在执行命令时调用 shell,因此您将获得类似 shell 的行为,将您的环境变量替换为它们值。将值作为构建参数传递给构建不会在容器启动时公开它们,这就是为什么它们随后被放入环境变量中的原因。从环境变量中使用它们的额外好处是您可以在不同的环境(开发、测试、阶段、生产等)中覆盖这些值。