Как вызвать RUN в Dockerfile с уникальными параметрами во время выполнения? (Установка Let's Encrypt для NGINX в Docker.) - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать 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?

1 Ответ

1 голос
/ 27 февраля 2020

Команда RUN в Dockerfile будет выполняться только при построении образа.

Переменная окружения CERTBOT_PARAMETERS, установленная в вашем файле docker, будет доступна только после изображение построено.

Я не уверен, как вы строите изображение, но если вы хотите передать значения, доступные во время сборки, вам нужно использовать аргументы сборки, например ,. при использовании docker -compose см. документы re ARGS: https://docs.docker.com/compose/compose-file/#args

, которые являются переменными среды, доступными только в процессе сборки.

Относительно CMD и ENTRYPOINT вы должны прочитать об их использовании, поскольку они не являются взаимоисключающими, см .: https://docs.docker.com/engine/reference/builder/#entrypoint

Они контролируют, какую команду запускает образ после запуска после образ строится, в то время как RUN используется только во время сборки.

...