如何在非root用户运行的Django Docker容器中配置django-crontab
问题根源
- 容器最终以普通用户
app身份运行,而alpine系统默认/usr/bin/crontab仅允许root用户调用 - 已安装的
dcron、libcap未做对应权限配置,普通用户仍无权限执行crontab命令,且crontab任务存储目录也未开放普通用户读写权限
解决方案
1. 修改Dockerfile的RUN指令
在RUN段的apk del .tmp-deps之前,添加crontab相关权限配置,修改后的完整RUN代码如下:
RUN python -m venv /py && \ apk add --update --no-cache postgresql-client && \ apk add --update --no-cache --virtual .tmp-deps \ build-base postgresql-dev musl-dev gcc python3-dev bash openssl-dev libffi-dev libsodium-dev linux-headers && \ apk add jpeg-dev zlib-dev libjpeg && \ apk add --update busybox-suid && \ apk --no-cache add dcron libcap && \ /py/bin/pip install --upgrade pip && \ /py/bin/pip install -r /requirements.txt && \ # 新增权限配置开始 # 方式一:设置suid权限(简单直接) # chmod u+s /usr/bin/crontab && \ # 方式二:用libcap设置最小必要权限(更安全,推荐) setcap cap_setuid,cap_setgid+ep /usr/bin/crontab && \ # 配置crontab任务存储目录权限 mkdir -p /var/spool/cron/crontabs && \ chown root:app /var/spool/cron/crontabs && \ chmod 1730 /var/spool/cron/crontabs && \ # 新增权限配置结束 apk del .tmp-deps && \ adduser --disabled-password --no-create-home app &&\ mkdir -p /vol/web/static && \ chown -R app:app /vol && \ chmod -R 755 /vol && \ chmod -R +x /scripts
两种权限配置方式二选一即可,推荐使用更安全的setcap方式。
2. 重新构建镜像
执行以下命令重新构建镜像,跳过旧缓存保证配置生效:
docker-compose build --no-cache app
3. 验证效果
重新执行测试命令即可正常返回结果:
docker-compose run --rm app sh -c "python manage.py crontab show"
内容的提问来源于stack exchange,提问作者Sumit Dhakad
相关产品推荐
相关产品推荐

