Я исходил из того, что все контейнеры будут максимально независимы от хоста, чтобы при переносе контейнеров не было необходимости что-то много настраивать (в т.ч. cron).
Наверно самым оптимальным будет вариант, предложенный
Максим Кудрявцев , с прокидыванием в контейнер самого докера. Как вариант, можно было установить весь докер в контейнер, но итоговый образ получался 200-300мб. Но оказалось, что уже есть отдельные docker-клиенты.
Итак, конфигурация получилась такая:
В docker-compose.yml добавляем секцию крона:
cron:
image: cron
build:
context: './images/cron'.
volumes:
#конфиги для крона
- ./config/cron:/etc/cron.d
#пробрасываем sock в readonly-режиме, чтобы docker внутри контейнера видел всё, что на хосте
- /var/run/docker.sock:/var/run/docker.sock:ro
В файл images/cron/Dokerfile пишем установку докер-клиента:
#используем сборку alpine с кроном - https://github.com/xordiv/docker-alpine-cron
FROM xordiv/docker-alpine-cron
#скачиваем и устанавливаем сборку с докер клиентом
ARG DOCKER_CLI_VERSION="18.06.3-ce"
ENV DOWNLOAD_URL="https://download.docker.com/linux/static/stable/x86_64/docker-$DOCKER_CLI_VERSION.tgz"
# install docker client
RUN mkdir -p /tmp/download \
&& curl -L $DOWNLOAD_URL | tar -xz -C /tmp/download \
&& mv /tmp/download/docker/docker /usr/bin/ \
&& rm -rf /tmp/download \
&& rm -rf /var/cache/apk/*
Готово! Проверяем:
user1@host:~$ docker-compose exec cron /usr/bin/docker exec user1_nginx_1 nginx -v
nginx version: nginx/1.15.10
Размер 42 мегабайта:
user1@host:~$ docker-compose images
Container Repository Tag Image Id Size
------------------------------------------------------------------------
user1_certbot_1 certbot/certbot latest 4bdc1514009b 108 MB
user1_crond_1 cron latest 5e632bfd8eb0 42.1 MB