我正在尝试使用docker build来启动一个webapp。为了生成证书,我想使用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构建期间执行此操作,而是在容器启动时生成证书。这是因为letencrypt会尝试在您指定的域(可能不在您构建映像的位置)上连接到服务器。
但是,为了减少启动时间,您将希望跳过引导依赖项(但是您将需要安装这些依赖项)。为此,我将在Dockerfile中使用以下命令列出证书(这将确保正确安装依赖项),然后更改CMD(假设您正在使用nginx映像)
Dockerfile:
ARG [email protected]
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是跳过依赖项的引导(安装python等)-m用于指定用于重要通知的电子邮件-d用于指定以逗号分隔的域列表
使用“ sh”,“-c”将在执行命令时调用外壳程序,因此您将获得类似于将环境变量替换为其值的行为的外壳程序。将值作为build args传递给build不会在容器启动时公开它们,这就是为什么然后将它们放入环境变量中的原因。从环境变量中使用它们的另一个好处是,您可以在不同的环境(开发,测试,阶段,产品等)中覆盖这些值。