Как перезапустить хост nginx изнутри docker после обновления certbot - PullRequest
0 голосов
/ 08 января 2020

Если у вас есть контейнер docker с сертификатом certbot, но экземпляр nginx использует эти сертификаты, работающие на хосте, как перезапустить хост nginx из контейнера docker?

Это бегущий контейнер

certbot:
    image: certbot/dns-ovh
    container_name: certbot
    volumes:
      - /etc/letsencrypt/:/etc/letsencrypt
      - /var/lib/letsencrypt:/var/lib/letsencrypt
      - /root/.secrets/certbot-ovh.ini:/root/.secrets/ovh-creds.ini
    entrypoint: /bin/sh -c 'trap exit  TERM; while :; do certbot renew sleep 12h & wait $${!}; done;'

1 Ответ

1 голос
/ 08 января 2020

Вы должны добавить --post-hook к команде renew, которая использует s sh для отправки команды перезагрузки nginx на хост.

Чтобы это работало, контейнеру нужны для запуска с network_mode: "host"

, тогда вам нужно isntall sshpass и openssh при запуске / воссоздании контейнера. это делается с помощью apk add openssh sshpass

, затем в перехвате необходимо s sh в хост и перезагрузить nginx

sshpass -p 'your password' ssh -o 'StrictHostKeyChecking no' root@localhost 'systemctl reload nginx'

при условии у вас есть root доступ. При этом используется sshpass для ввода пароля в s sh, который пропускает сообщение «Вы хотите добавить отпечаток пальца» и отправляет команду реляции на localhost

, помещая все это в docker -композитный внешний вид файла вот так:

  certbot:
    image: certbot/dns-ovh
    container_name: certbot
    network_mode: "host"
    volumes:
      - /etc/letsencrypt/:/etc/letsencrypt
      - /var/lib/letsencrypt:/var/lib/letsencrypt
      - /root/.secrets/certbot-ovh.ini:/root/.secrets/ovh-creds.ini
    entrypoint: >
      /bin/sh -c 
      'apk add openssh sshpass &&
      trap exit  TERM; while :;
      do certbot renew --post-hook 
      "sshpass -p '"'"'your password'"'"' ssh -o '"'"'StrictHostKeyChecking no'"'"' root@localhost '"'"'systemctl reload nginx'"'"'";
      sleep 12h & wait $${!}; done;'

> здесь позволяет писать столько строк с отступом, сколько я хочу, без необходимости добавлять еще один слой экранирования. он также объединяет строки в одну строку позже.

'"'"', используемый здесь, используется для выхода из одиночного ' внутри кавычек --post-hook, закрывает первую одинарную кавычку, открывает новую двойная кавычка, которая содержит одинарную кавычку, а затем снова открывает одинарную кавычку.

...