【问题标题】:Cron python job and Docker logsCron python 作业和 Docker 日志
【发布时间】:2020-01-13 08:38:18
【问题描述】:

我有一个 Python 脚本作为 cron 作业在 docker 容器中运行,我想在 docker 日志中查看标准输出,例如我的脚本中有以下行

print("BT: " + bt)

我想在运行docker logs some-container 时看到这个输出 我的 cron 工作如下

* * * * * root /usr/local/bin/python /opt/platform-location/platform-location.py >> /var/log/cron.log 2>&1

我正在从 Dockerfile 运行cron,如下所示:

FROM python:3

WORKDIR /opt/platform-location
COPY requirements.txt requirements.txt
COPY URLs.txt URLs.txt
COPY platform-location.py   platform-location.py
COPY platform-location.cron /etc/cron.d/platform-location
RUN pip install -r requirements.txt
RUN chmod 0644 /etc/cron.d/platform-location
RUN touch /var/log/cron.log
RUN apt-get update && apt-get upgrade -y && apt-get -y install cron vim
CMD cron && tail -f /var/log/cron.log

你能帮帮我吗?

PS:它不是 Docker 中的 Python Logging 的重复,因为我想在运行 docker logs 命令而不是 docker exec 命令时查看输出。 我也在使用另一个问题记者没有使用的 cron。

【问题讨论】:

  • Python Logging in Docker的可能重复
  • @HampusLarsson 不,不是,我想在运行 docker logs 命令而不是 docker exec 命令时查看输出

标签: python docker cron stdout


【解决方案1】:

问题不在于 python 脚本,您是否验证了 CMD cron && tail -f /var/log/cron.log 没有 python 的 cron 日志?

使用下图,我确信上面的 sn-p 可以正常工作,但是 cron 无法将日志写入控制台,因此 python 也不会写入。

这是工作示例。

FROM python:3.7-alpine3.9
COPY test.py /test.py
RUN cat /test.py
RUN echo "* * * * * echo hello" | crontab - 

RUN echo "* * * * * python /test.py" | crontab -

CMD ["crond","-f"]

test.py

my_string = "Hello, World!"
print(my_string)

图片包含 Python 版本3.7.4。您可以将基础映像更改为任何python version,如果基于 alpine,将可以正常工作。

更新: 在指定位置仔细检查您的 python 文件是否存在,因为这是您可以尝试的工作示例。

FROM python:3.6
RUN apt-get update && apt-get -y install cron vim

WORKDIR /opt/platform-location
RUN echo "* * * * * root /usr/local/bin/python /opt/platform-location/platform-location.py >> /var/log/cron.log 2>&1" >> /etc/cron.d/platform-location
RUN echo 'print ("hello World! ")' >> /opt/platform-location/platform-location.py
RUN chmod 0644 /etc/cron.d/platform-location
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log

【讨论】:

  • 谢谢,我无法使用您的解决方案,因为我没有使用 crontab。我修改了我的问题以包含我的 Dockerfile。你能再检查一下,告诉我应该改变什么吗?
  • 顺便说一句,为什么?而且我认为crontab和cron之间没有那么大的区别?