【问题标题】:How To Run Cron As Non Root In Alpine如何在 Alpine 中以非 root 身份运行 Cron
【发布时间】:2020-11-12 17:02:23
【问题描述】:

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: docker cron sh devops alpine


    【解决方案1】:

    不知道您要达到什么目标,但我会在操作系统级别上做到这一点。

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

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

    当您想要进行一些日志记录时,您可以这样做:

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

    【讨论】:

      【解决方案2】:

      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.
      

      【讨论】:

      • 当我尝试这种解决方案时,我得到setpgid: Operation not permitted
      • 据我了解,在使用非 root 帐户时存在问题,此处已回答 stackoverflow.com/a/45280550/5689995。有一个解决方案可以开始使用替代容器而不是 Crontab。
      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2017-02-06
      • 2020-11-16
      • 2020-01-05
      • 1970-01-01
      相关资源
      最近更新 更多