在 Alpine 容器中启用 crond

zar*_*ski 6 cron docker alpine-linux

语境

我正在尝试在Alpine容器中安排一些摄取作业。我花了一段时间才明白为什么我的cron 作业没有启动:crond 似乎没有运行

rc-service -l | grep crond 
Run Code Online (Sandbox Code Playgroud)

根据Alpine 的文档, crond 必须首先以openrc(即某种systemctl)开头。这是 Dockerfile

FROM python:3.7-alpine

# set work directory
WORKDIR /usr/src/collector

RUN apk update \
    && apk add curl openrc

# ======>>>> HERE !!!!! 
RUN rc-service crond start && rc-update add crond

# install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
COPY ./Pipfile /usr/src/collector/Pipfile
RUN pipenv install --skip-lock --system --dev

# copy entrypoint.sh
COPY ./entrypoint.sh /usr/src/collector/entrypoint.sh

# copy project
COPY . /usr/src/collector/

# run entrypoint.sh
ENTRYPOINT ["/usr/src/collector/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

entrypoint.sh 仅在末尾附加作业 /etc/crontabs/root

问题

我收到以下错误:

 * rc-service: service `crond' does not exist
ERROR: Service 'collector' failed to build: The command '/bin/sh -c rc-service crond start && rc-update add crond' returned a non-zero code: 1
Run Code Online (Sandbox Code Playgroud)

事情开始变得有点循环。rc-service 如何同时不识别服务:

  • sh好像听说过这个名字crond

  • 有一个 /etc/crontabs/root

我错过了什么?

Cla*_*ent 3

一些 Alpine Docker 容器缺少busybox-initscripts 包。只需将其附加到命令末尾apk add, crond 就应该作为服务运行。

您可能还需要从 Dockerfile 中删除以下行,因为busybox-initscripts似乎在安装后立即将 crond 作为服务运行:

RUN rc-service crond start && rc-update add crond
Run Code Online (Sandbox Code Playgroud)