因此,我对创建容器非常陌生,我有一个简单的Dockerfile,我想在这里每分钟运行一个简单的python脚本:
FROM python:3.8-buster
RUN apt-get update && apt-get install -y cron
COPY my_python /bin/my_python
COPY root /var/spool/cron/crontabs/root
RUN chmod +x /bin/my_python
CMD cron -l 2 -f
其中my_python:
print("hi world!!")
和根:
* * * * * python3 /bin/my_python
然后我只创建图像和容器:
docker image build -t python-test
docker container run -it --name python-test python-test
我应该每分钟看到一次关于hi世界的打印,但是当运行容器(在图像构建之后)时,似乎没有出现任何日志。
我做错什么了?
发布于 2021-01-24 09:04:48
首先,我认为您希望在您的-L 2
命令行中使用-l 2
而不是-l 2
;有关详细信息,请参阅手册页。
cron
守护进程登录到syslog,所以如果某些东西没有按预期工作,那么安排接收这些消息是个好主意。busybox
工具提供了一个简单的syslog守护进程,它可以登录到内存中的缓冲区和读取这些日志的工具,因此我修改了Dockerfile
如下所示:
FROM python:3.8-buster
RUN apt-get update && apt-get install -y cron busybox
COPY my_python /bin/my_python
COPY root /var/spool/cron/crontabs/root
RUN chmod +x /bin/my_python
CMD busybox syslogd -C; cron -L 2 -f
启动此操作后,我将docker exec
d放入容器并运行busybox logread
并发现:
Jan 24 16:50:45 7f516db86417 cron.info cron[4]: (CRON) INFO (pidfile fd = 3)
Jan 24 16:50:45 7f516db86417 cron.info cron[4]: (root) INSECURE MODE (mode 0600 expected) (crontabs/root)
Jan 24 16:50:45 7f516db86417 cron.info cron[4]: (CRON) INFO (Running @reboot jobs)
因此,您的问题是:root
crontab上的权限不正确。有两种方法可以解决这个问题:
chmod
文件,或者crontab
命令来安装这个文件,它为我们处理这个问题。我喜欢选项2,因为这意味着我们不需要知道cron
在权限方面所期望的细节。这会让我们:
FROM python:3.8-buster
RUN apt-get update && apt-get install -y cron busybox
COPY my_python /bin/my_python
COPY root /tmp/root.crontab
RUN crontab /tmp/root.crontab
RUN chmod +x /bin/my_python
CMD busybox syslogd -C; cron -L 2 -f
通过这一更改,我们可以确认cron作业正在按预期运行:
Jan 24 16:59:50 8aa688ad31cc syslog.info syslogd started: BusyBox v1.30.1
Jan 24 16:59:50 8aa688ad31cc cron.info cron[4]: (CRON) INFO (pidfile fd = 3)
Jan 24 16:59:50 8aa688ad31cc cron.info cron[4]: (CRON) INFO (Running @reboot jobs)
Jan 24 17:00:01 8aa688ad31cc authpriv.err CRON[7]: pam_env(cron:session): Unable to open env file: /etc/default/locale: No such file or directory
Jan 24 17:00:01 8aa688ad31cc authpriv.info CRON[7]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 24 17:00:02 8aa688ad31cc cron.info CRON[7]: (root) END (python3 /bin/my_python)
Jan 24 17:00:02 8aa688ad31cc authpriv.info CRON[7]: pam_unix(cron:session): session closed for user root
但是.容器里还是没有输出!如果你翻阅手册页,你会发现:
然后,cron每分钟醒来,检查所有存储的crontab,检查每个命令是否应该在当前分钟内运行。在执行命令时,任何输出都会邮寄给crontab的所有者(如果存在,则发送给crontab中MAILTO环境变量中指定的用户).
换句话说,cron
从程序中收集输出,并试图发送给拥有cron作业的用户。如果希望在控制台上看到来自cron
作业的输出,则需要显式地重定向stdout,如下所示:
* * * * * python3 /bin/my_python > /dev/console
在进行此更改后,运行图像将导致消息.
hi world!
...printing每分钟到控制台一次。
https://stackoverflow.com/questions/65871983
复制