Я пытаюсь создать Dockerfile для настройки Let's Encrypt. Мой элементарный проект Docker Compose содержит следующие три файла:
- test / docker -compose.yml
- test / nginx / Dockerfile
- test / letsencrypt / Dockerfile
Let's Encrypt необходимо сделать две вещи: (1) первоначальную установку сертификатов веб-сайта после подтверждения владения доменом и (2) периодическое c обновление сертификатов каждые 60- 90 дней, используя работу cron. Первоначальная установка сертификатов является идеальным вариантом использования для команды RUN в Dockerfile, поскольку она происходит только один раз при установке, тогда как продление сертификата periodi c идеально подходит для команды ENTRYPOINT в Dockerfile, поскольку она должна выполняться постоянно.
Однако Если я включу полную команду «RUN certbot certonly -d example.com ...» в Dockerfile, сборка не удастся, потому что приложению Let's Encrypt Certbot требуется работающий веб-сервер для проверки правильности имени домена. Чтобы решить эту проблему, я хотел бы вызвать "RUN certbot --help" во время сборки, а затем вызвать "RUN certbot certonly -d example.com ..." во время выполнения после запуска NGINX.
Мой Docker Создать файл организован следующим образом:
services:
nginx:
...
letsencrypt:
...
environment:
CERTBOT_PARAMETERS: 'certonly -d example.com ...'
depends_on:
- nginx
И мой dockerfile Let's Encrypt выглядит так:
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 exe c -it CONTAINER_NAME / bin / bash» и затем вручную запускаю «certbot certonly -d example.com ...» внутри контейнера docker, то сертификаты действительно устанавливаются.
Я предполагаю, что есть проблема с вызовом моей переменной среды CERTBOT_PARAMETERS во время выполнения. Возможно, он не может принимать пробелы?
Как я могу вызвать другую команду RUN во время выполнения, чем во время сборки? Должен ли я использовать CMD вместо RUN? Если да, допустимо ли вызывать CMD и ENTRYPOINT на разных этапах в Dockerfile?