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

问题描述 投票:0回答: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"]

入口点.sh

#!/bin/sh

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

# Start application.

我读到提升权限不是一个好的做法。因此,我希望在我的脚本中消除

su-exec
+
chmod u+s /sbin/su-exec
的使用。我也尝试了
su
sudo
,但他们要求输入
root
密码,所以我改用
su-exec
。我需要提升权限,因为如果不将其启动为
crond
root
就无法正常运行。该容器将在 Kubernetes 中运行。

有更好的方法吗?

docker cron sh devops alpine-linux
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"]

入口点.sh

#!/bin/sh

# Start cron daemon.
crond -b -l 8

# Start application.

1
投票

不知道你想实现什么目标,但我会在操作系统级别上做到这一点。

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

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

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

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

0
投票

就像 @and-finally 在 bitnami/gitea docker 镜像上一样,我无法使用 setpcap,因为它会生成

setpgid: Operation not permitted

我的解决方案是稍微修改旧的但强大的http://www.jimpryor.net/linux/dcron.html.

如果

crond
未在 uid=0 的情况下运行,它不会尝试更改用户,因此以当前用户身份运行 cron。

因此,在我的 bitnami/gitea 上使用 uid=1001 运行 gitea,我使用同一用户运行 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
© www.soinside.com 2019 - 2024. All rights reserved.