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

3

我正在尝试使用以下脚本运行容器:

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中运行。

有更好的方法吗?

3个回答

3

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.

5
当我尝试这种解决方案时,我会得到 setpgid: 操作不允许 的错误提示。 - And Finally
据我所了解,当使用非root帐户时存在问题,如此处所答复的 https://dev59.com/4lcP5IYBdhLWcg3wDWRq#45280550 。提供了一种解决方案,即为容器开始使用替代方法而不是Crontab。 - laimison
作为解决“Operation not permitted”问题的方法,我使用入口脚本将crond运行为非1 PID 如此处所述。它能够正常工作。 - Lenar Hoyt

1

我不知道你想达到什么目的,但我会在操作系统级别上完成它。

您可以创建一个cronjob来执行容器中的某些操作,如果这样有帮助的话。 尝试使用类似以下内容的东西:

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

当您想要进行一些日志记录时,可以执行以下操作:
/usr/bin/docker exec <container_name> <command> > <path_to_log>

0

就像在bitnami/gitea docker镜像上的@and-finally一样,我无法使用setpcap,因为它会生成一个setpgid: Operation not permitted的错误。

我的解决方案是稍微修改一下旧但稳定的http://www.jimpryor.net/linux/dcron.html

如果crond不是以uid=0运行的,它就不会尝试更改用户,因此会以当前用户的身份运行cron。

所以在我的bitnami/gitea上,我以uid=1001的同一用户运行crond,这对于在/etc/cron.d中执行cron作业非常完美:

* 3 * * *                  my_custom_script

这个修改非常容易,但如果你不想自己动手,它可以在https://github.com/eltorio/dcron上托管。

例如,这是我定制的bitnami/gitea Docker镜像。

FROM bitnami/gitea:latest as busyboxbuilder
USER root
RUN cd / \
    && apt-get update -y \
    && apt-get install -y build-essential curl libntirpc-dev
COPY busybox/busybox-1.36.1.tar.bz2 /busybox-1.36.1.tar.bz2
RUN cd / &&  tar -xjvf  busybox-1.36.1.tar.bz2
COPY busybox/busybox.config /busybox-1.36.1/.config
RUN cd /busybox-1.36.1/ && make install

FROM bitnami/gitea:latest as dcronbuilder
USER root
RUN cd / \
    && apt-get update -y \
    && apt-get install -y build-essential curl libntirpc-dev git
RUN mkdir -p /etc/cron.d && chown -R 1001 /etc/cron.d
RUN git clone https://github.com/eltorio/dcron.git \
    && cd dcron \
    && make CRONTAB_GROUP=gitea CRONTABS=/tmp/crontabs CRONSTAMPS=/tmp/cronstamps

FROM bitnami/gitea:latest
USER root
RUN apt-get update -y && apt install -y --no-install-recommends vim
RUN mkdir -p /opt/bitnami/custom/public
COPY --chmod=0755 libgitea.sh /opt/bitnami/scripts/libgitea.sh
COPY --chmod=0755 gitea-env.sh /opt/bitnami/scripts/gitea-env.sh
COPY --chmod=0755 autobackup.sh /usr/local/bin/autobackup
COPY --from=busyboxbuilder /busybox-1.36.1/_install/bin/busybox /bin/busybox
RUN ln -svf /bin/busybox /usr/sbin/sendmail \
    && chmod ugo+x /opt/bitnami/scripts/libgitea.sh \
    && chmod ugo+x /opt/bitnami/scripts/gitea-env.sh \
    && chmod ugo+x /usr/local/bin/autobackup 
COPY --from=dcronbuilder /opt/bitnami/gitea/dcron/crond /usr/sbin/crond
RUN mkdir -p /etc/cron.d && chown -R 1001 /etc/cron.d && chmod 0755 /usr/sbin/crond

WORKDIR /opt/bitnami/gitea
USER 1001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接