首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用crontab和简单python脚本运行简单的docker容器

尝试使用crontab和简单python脚本运行简单的docker容器
EN

Stack Overflow用户
提问于 2021-01-24 14:48:06
回答 1查看 983关注 0票数 0

因此,我对创建容器非常陌生,我有一个简单的Dockerfile,我想在这里每分钟运行一个简单的python脚本:

代码语言:javascript
复制
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:

代码语言:javascript
复制
print("hi world!!")

和根:

代码语言:javascript
复制
* * * * * python3 /bin/my_python

然后我只创建图像和容器:

代码语言:javascript
复制
 docker image build -t python-test
 docker container run -it --name python-test python-test

我应该每分钟看到一次关于hi世界的打印,但是当运行容器(在图像构建之后)时,似乎没有出现任何日志。

我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-24 17:04:48

首先,我认为您希望在您的-L 2命令行中使用-l 2而不是-l 2;有关详细信息,请参阅手册页

cron守护进程登录到syslog,所以如果某些东西没有按预期工作,那么安排接收这些消息是个好主意。busybox工具提供了一个简单的syslog守护进程,它可以登录到内存中的缓冲区和读取这些日志的工具,因此我修改了Dockerfile如下所示:

代码语言:javascript
复制
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 execd放入容器并运行busybox logread并发现:

代码语言:javascript
复制
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上的权限不正确。有两种方法可以解决这个问题:

  1. 当我们将文件复制到适当的位置时,我们可以显式地chmod文件,或者
  2. 我们可以使用crontab命令来安装这个文件,它为我们处理这个问题。

我喜欢选项2,因为这意味着我们不需要知道cron在权限方面所期望的细节。这会让我们:

代码语言:javascript
复制
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作业正在按预期运行:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
* * * * * python3 /bin/my_python > /dev/console

在进行此更改后,运行图像将导致消息.

代码语言:javascript
复制
hi world!

...printing每分钟到控制台一次。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65871983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档