我正在尝试使用以下脚本运行容器:
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 中运行。
有更好的方法吗?
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.
不知道你想实现什么目标,但我会在操作系统级别上做到这一点。
您可以创建一个 cronjob 来在容器中执行某些操作,这会有所帮助。 尝试使用这样的东西:
/usr/bin/docker exec <container_name> <command>
当您想要进行一些日志记录时,您可以这样做:
/usr/bin/docker exec <container_name> <command> > <path_to_log>
就像 @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