我的目标是运行一个包含 crontab 的 Docker 容器。因此,我希望作为非 root 用户能够运行计划的 crontab 作业。我正在运行以下 Docker 映像:
FROM openjdk:8
RUN apt-get update && apt-get -y install nano
RUN apt-get update && apt-get -y install cron
RUN service cron start # tried both
RUN cron # tried both
ENV TZ="Europe/Rome"
RUN useradd -u 8877 myuser
USER myuser
CMD ["tail", "-f", "/dev/null"]
我将其部署在 Docker 堆栈中:
...
crontab:
image: reg/image
cap_drop:
- cap_dac_override
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: any
delay: 3s
window: 60s
placement:
constraints: [node.role == manager]
update_config:
delay: 2s
volumes:
- v:/my/vol
environment:
- PUID=8877
- PGID=8877
...
当我docker exec -it <id> bash
以 myuser 身份运行到容器中时,我执行 service cron status 并输出“cron is running”。但如果我运行crontab -e
,我正在编写的文件会出现红色错误消息“历史文件有问题”。如果我尝试保存它,则会出现其他错误,例如“没有 myuser 的 crontab - 使用空的一触式:无法触摸 '/home/myuser/.selected_editor':没有这样的文件或目录 无法创建目录 /home/myuser/。 local/share/nano/:没有这样的文件或目录,需要保存/加载搜索历史记录或光标位置。”
答案1
限制 crontab 使用的方法可能不止一种。请参阅您的安装的 crontab 联机帮助页。
在最简单的情况下,控制是通过文件 /etc/cron.allow、/etc/cron.deny 进行的。它们的使用规则非常具体:
- 如果两个文件都不存在,则只有 root 可以运行 crontab
- 如果 cron.allow 存在,则必须列出您的用户名才能使用 crontab。
- 禁止 cron.deny 中的所有用户。
- 如果仅存在 cron.deny,则所有未提及的用户都可以使用 crontab。