如何 运行 在 Alpine 中以非 root 身份进行 Cron

How To Run Cron As Non Root In Alpine

我正在尝试 运行 一个包含以下脚本的容器:

Dockerfile

FROM alpine:latest

USER root

RUN apk update \
    && apk upgrade \
    && apk --no-cache add busybox-suid su-exec
RUN chmod u+s /sbin/su-exec

RUN groupadd -r -g 2001 myuser \
    && useradd -r -u 1001 -g myuser myuser

RUN mkdir /home/myuser \
    && chown myuser /home/myuser

COPY --chown=myuser:myuser entrypoint.sh /home/myuser/entrypoint.sh
COPY --chown=myuser:myuser cronjob /home/myuser/cronjob

USER myuser

RUN crontab /home/myuser/cronjob
WORKDIR /home/myuser
ENTRYPOINT["./entrypoint.sh"]

entrypoint.sh

#!/bin/sh

# Start cron daemon.
su-exec root crond -f -l 8

# Start application.

我了解到提升权限不是好的做法。因此,我希望消除在脚本中使用 su-exec + chmod u+s /sbin/su-exec 的情况。我也尝试了 susudo,但他们要求输入 root 密码,所以我切换到 su-exec。我需要提升权限,因为 crond 在不以 root 启动它的情况下不能正确地 运行。此容器将在 Kubernetes 中 运行。

有更好的方法吗?

不知道你想要达到什么目的,但我会在 OS 级别上完成。

您可以创建一个 cronjob 来在您的容器中执行某些操作,这会有所帮助。 尝试使用这样的东西:

/usr/bin/docker exec <container_name> <command>

如果您想进行一些日志记录,您可以这样做:

/usr/bin/docker exec <container_name> <command> > <path_to_log>
按照以下答案后,

crond 现在 运行 为 myuser

https://github.com/gliderlabs/docker-alpine/issues/381#issuecomment-621946699

Dockerfile

FROM alpine:latest

USER root

RUN apk update \
    && apk upgrade \
    && apk --no-cache add dcron libcap

RUN groupadd -r -g 2001 myuser \
    && useradd -r -u 1001 -g myuser myuser

RUN mkdir /home/myuser \
    && chown myuser /home/myuser

RUN chown myuser:myuser /usr/sbin/crond \
    && setcap cap_setgid=ep /usr/sbin/crond

COPY --chown=myuser:myuser cronjob /home/myuser/cronjob
RUN crontab /home/myuser/cronjob

COPY --chown=myuser:myuser entrypoint.sh /home/myuser/entrypoint.sh

USER myuser

WORKDIR /home/myuser
ENTRYPOINT["./entrypoint.sh"]

entrypoint.sh

#!/bin/sh

# Start cron daemon.
crond -b -l 8

# Start application.