如何在运行时使用唯一参数调用运行在Dockerfile中?(在Docker中为NGINX安装Let's Encrypt。)

如何在运行时使用唯一参数调用运行在Dockerfile中?(在Docker中为NGINX安装Let's Encrypt。),docker,nginx,docker-compose,dockerfile,lets-encrypt,Docker,Nginx,Docker Compose,Dockerfile,Lets Encrypt,我正在尝试创建Dockerfile来设置Let's Encrypt。我的初级Docker Compose项目包含以下三个文件: test/docker-compose.yml 测试/nginx/Dockerfile test/letsencrypt/Dockerfile 让我们加密需要做两件事:1在验证域所有权后初始安装网站证书,2使用cron作业每隔60-90天定期更新证书。证书的初始安装是Dockerfile的RUN命令的理想使用案例,因为它只在安装时发生一次,而定期证书更新是Dockerf

我正在尝试创建Dockerfile来设置Let's Encrypt。我的初级Docker Compose项目包含以下三个文件:

test/docker-compose.yml 测试/nginx/Dockerfile test/letsencrypt/Dockerfile 让我们加密需要做两件事:1在验证域所有权后初始安装网站证书,2使用cron作业每隔60-90天定期更新证书。证书的初始安装是Dockerfile的RUN命令的理想使用案例,因为它只在安装时发生一次,而定期证书更新是Dockerfile的ENTRYPOINT命令的理想使用案例,因为它需要持续运行

但是,如果我包括完整运行的certbot certonly-d example.com。。。命令,它无法生成,因为Let's Encrypt的Certbot应用程序需要运行的web服务器来验证域名的有效性。为了解决这个问题,我想在构建过程中调用RUN certbot-help,然后调用RUN certbot certonly-d example.com。。。在NGINX启动后的运行时

我的Docker Compose文件组织如下:

services:
  nginx:
    ...
  letsencrypt:
    ...
    environment:
      CERTBOT_PARAMETERS: 'certonly -d example.com ...'
    depends_on:
      - nginx
我的Let's Encrypt 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-d时,所有东西都运行,但证书没有安装。如果我调用docker exec-it CONTAINER\u NAME/bin/bash,然后运行certbot certonly-d example.com。。。在docker容器中手动安装证书,然后安装证书

我假设在运行时调用我的CERTBOT_参数环境变量时出现问题。也许它不能接受空格

如何在运行时调用与生成时不同的RUN命令?我应该使用CMD而不是RUN吗?如果是这样,在Dockerfile的不同阶段调用CMD和ENTRYPOINT是否可以接受?

Dockerfile中的RUN命令将仅在生成映像时执行

docker compose文件中设置的CERTBOT_参数环境变量仅在生成映像后可用

我不确定您是如何构建映像的,但如果希望传递在构建时可用的值,则需要使用构建参数,例如,。如果使用docker compose,请参阅文档相关参数:

这些是仅在构建过程中可访问的环境变量

关于CMD和ENTRYPOINT,您应该仔细阅读它们的使用,因为它们不是相互排斥的,请参阅:

它们控制映像在生成映像后启动后运行的命令,而RUN仅在生成期间使用