# Scheduler dos crons — busybox crond batendo nas rotas /api/v1/cron/* pela rede # interna do compose. Sem docker.sock: o contêiner não fala com o daemon, só HTTP. # # Existe como imagem (em vez de `alpine:3.20` + `apk add` no command do compose) # porque instalar pacote em todo start amarra a recuperação do cron do cliente à # internet da VPS e ao mirror do Alpine — dependência de rede num caminho que # deveria ser offline. Doutrina: docs/doctrine/packaging.md, invariante 1. FROM alpine:3.20 LABEL org.opencontainers.image.source="https://github.com/melgarafael/DeskcommCRM" \ org.opencontainers.image.licenses="MIT" \ org.opencontainers.image.title="DeskcommCRM scheduler" ENV TZ=UTC RUN apk add --no-cache curl tzdata COPY docker/scheduler/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh # A versão depois das camadas que custam (o `apk add`): a instrução `ARG` entra # na chave de cache de tudo o que vem depois, e ela muda a cada release. ARG APP_VERSION=dev ENV APP_VERSION=$APP_VERSION # Prova de vida: se o crond morrer, o contêiner cai e o `restart: unless-stopped` # o traz de volta. Sem isto, um crond morto fica indistinguível de um cron ocioso. HEALTHCHECK --interval=60s --timeout=5s --start-period=10s --retries=3 \ CMD pgrep crond >/dev/null || exit 1 CMD ["/usr/local/bin/entrypoint.sh"]