如果服务可以在没有特权的情况下运行,请使用USER更改为非root用户。
对于cron
,这似乎不切实际,因为cron
需要root特权才能正常运行。但是,cron
运行的可执行文件不需要root特权。因此,我以cron
用户身份运行root
本身,但通过crontab
以非root用户身份调用我的crontab -u <user>
脚本以运行可执行文件(在这种情况下,是我编写的简单Python FTP下载脚本) ]命令。
cron / Docker的交互性和社区经验似乎仍处于起步阶段,但是有一些不错的解决方案。利用从this和this优秀文章中收集的经验教训,我得出了一个看起来像这样的Dockerfile:
FROM python:3.7.4-alpine
RUN adduser -S riptusk331
WORKDIR /home/riptusk331
... boilerplate not necessary to post here ...
COPY mycron /etc/cron.d/mycron
RUN chmod 644 /etc/cron.d/mycron
RUN crontab -u riptusk331 /etc/cron.d/mycron
CMD ["crond", "-f", "-l", "0"]
[mycron
文件只是每分钟运行的简单python执行
* * * * * /home/riptusk331/venv/bin/python3 /home/riptusk331/ftp.py
这很好,但是我不确定这里如何正确处理日志记录。我看不到/var/log/cron
中保存的任何内容。我可以在终端上看到cron
和ftp.py
的输出,也可以在Kitematic中将其拉到容器日志中。但是我不知道这里到底发生了什么。
所以,我的第一个问题是:这里如何处理日志记录和输出(在cron作业之后没有任何重定向),并且此实现方法可以并且安全吗?] >>
VonC对this post的回答建议将> /proc/1/fd/1 2>/proc/1/fd/2
附加到您的cron作业中,以将输出重定向到Docker的stdout
和stderr
。这是我俩都有些困惑,并且遇到麻烦的地方。
我的crontab文件现在看起来像这样
已经准备好输出到stdout / stderr,但是我不确定。我只知道它显示在我的终端上。那么为什么需要这种重定向?* * * * * /home/riptusk331/venv/bin/python3 /home/riptusk331/ftp.py > /proc/1/fd/1 2>/proc/1/fd/2
没有任何重定向的输出appeared
当我添加此重定向时,遇到权限问题。回想一下,该crontab被称为非root用户
riptusk331
。因此,我没有超级用户访问权限,并收到以下错误:/bin/ash: can't create /proc/1/fd/1: Permission denied
Docker最佳实践状态:如果服务可以在没有特权的情况下运行,请使用USER更改为非root用户。对于cron来说,这似乎不切实际,因为cron需要root特权才能...
Alpine基本映像基于名为BusyBox的紧凑工具集,当您在此处运行crond
时,得到的是BusyBox cron,而不是其他任何实现。它的documentation有点稀疏,但是如果您查看the crond source(在C语言中),则会发现在运行作业时根本没有任何重定向(请参阅的非发送邮件版本)。 start_one_job
);作业的标准输出和标准错误是crond的标准输出和标准错误。在Docker中,由于crond是容器的主要进程,因此又成为了容器的输出流。
Alpine基本映像基于名为BusyBox的紧凑工具集,当您在此处运行crond
时,得到的是BusyBox cron,而不是其他任何实现。它的documentation有点稀疏,但是如果您查看the crond source(在C语言中),则会发现在运行作业时根本没有任何重定向(请参阅的非发送邮件版本)。 start_one_job
);作业的标准输出和标准错误是crond的标准输出和标准错误。在Docker中,由于crond是容器的主要进程,因此又成为了容器的输出流。