[英]How to configure Let's encrypt certificates for nginx inside a docker image?
[英]How to call RUN in Dockerfile with unique parameters at runtime? (Installing Let's Encrypt for NGINX in Docker.)
我正在尝试创建一个 Dockerfile 来设置 Let's Encrypt。 我的基本 Docker Compose 项目包含以下三个文件:
Let's Encrypt 需要做两件事:(1)在验证域所有权时初始安装网站证书,以及(2)使用 cron 作业每 60-90 天定期更新证书。 证书的初始安装是 Dockerfile 的 RUN 命令的理想用例,因为它只在安装时发生一次,而定期证书更新是 Dockerfile 的 ENTRYPOINT 命令的理想选择,因为它需要持续运行。
但是,如果我在 Dockerfile 中包含完整的“RUN certbot certonly -d example.com ...”命令,它将无法构建,因为 Let's Encrypt 的 Certbot 应用程序需要一个正在运行的 Web 服务器来验证域名的有效性。 我想解决这个问题是在构建期间调用“RUN certbot --help”,然后在 NGINX 启动后在运行时调用“RUN certbot certonly -d example.com ...”。
我的 Docker Compose 文件组织如下:
services:
nginx:
...
letsencrypt:
...
environment:
CERTBOT_PARAMETERS: 'certonly -d example.com ...'
depends_on:
- nginx
我的让我们加密 dockerfile 是:
FROM ubuntu:bionic
ENV CERTBOT_PARAMETERS="--help"
...
# Install Certs
RUN certbot $CERTBOT_PARAMETERS
...
# Renew Certs
RUN apt-get -y install cron && \
printf "30 */12 * * * root certbot renew > /proc/1/fd/1 2>/proc/1/fd/2\n" > /etc/cron.d/certbot && \
chmod 644 /etc/cron.d/certbot && \
crontab /etc/cron.d/certbot
ENTRYPOINT ["cron", "-f"]
这成功构建,但是当我调用“docker-compose up -d”时,一切都在运行,但没有安装证书。 如果我调用“docker exec -it CONTAINER_NAME /bin/bash”,然后在 docker 容器中手动运行“certbot certonly -d example.com ...”,那么证书就会被安装。
我认为在运行时调用我的 CERTBOT_PARAMETERS 环境变量存在问题。 也许它不能接受空格?
如何在运行时调用与构建时不同的 RUN 命令? 我应该使用 CMD 而不是 RUN 吗? 如果是这样,在Dockerfile的不同阶段调用CMD和ENTRYPOINT是否可以接受?
Dockerfile 中的RUN
命令只会在构建镜像时执行。
CERTBOT_PARAMETERS
-compose 文件中设置的CERTBOT_PARAMETERS
环境变量仅在构建映像后可用。
我不确定您是如何构建图像的,但是如果您想传递构建时可用的值,则需要使用构建参数,例如。 如果使用 docker-compose 查看文档 re ARGS
: https : //docs.docker.com/compose/compose-file/#args
它们是只能在构建过程中访问的环境变量。
关于CMD
和ENTRYPOINT
,您应该阅读它们的使用,因为它们不是相互排斥的,请参阅: https : ENTRYPOINT
它们控制映像在构建后启动后运行的命令,而RUN
仅在构建期间使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.