如何在Docker容器中运行cron作业?

b09cbbtk  于 2023-02-07  发布在  Docker
关注(0)|答案(3)|浏览(226)

我有一个python脚本,填充Postgres数据库在AWS.
我可以手动运行它,它是加载数据到数据库没有任何问题。我想运行它每5分钟内一个码头集装箱一次。
所以我把它包含在docker映像中运行。但是我不确定为什么它没有运行。我看不到任何附加到/var/log/cron.log文件的内容。有人能帮我找出为什么它没有运行吗?
我能够在Docker构建期间将脚本复制到映像,并能够手动运行它。数据库正在填充,我得到了预期的输出。
脚本位于当前目录中,将复制到/code/文件夹
下面是我的代码:

    • 停靠文件:**
FROM python:3
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get install -y cron
RUN apt-get install -y postgresql-client
RUN touch /var/log/cron.log
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD . /code/
COPY crontab /etc/cron.d/cjob
RUN chmod 0644 /etc/cron.d/cjob
CMD cron && tail -f /var/log/cron.log
    • crontab:**
*/5 * * * * python3 /code/populatePDBbackground.py >> /var/log/cron.log
# Empty line
hujrc8aj

hujrc8aj1#

Crontab需要其他字段:运行以下命令的用户:

* * * * * root python3 /code/populatePDBbackground.py >> /var/log/cron.log
# Empty line

Dockerfile为:

FROM python:3
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get install -y cron postgresql-client
RUN touch /var/log/cron.log
RUN mkdir /code
WORKDIR /code
ADD . /code/
COPY crontab /etc/cron.d/cjob
RUN chmod 0644 /etc/cron.d/cjob
ENV PYTHONUNBUFFERED 1
CMD cron -f

测试python脚本populatePDBbackground.py为:

from datetime import datetime

print('Script has been started at {}'.format(datetime.now()))

最后我们得到:

$ docker run -d b3fa191e8822
b8e768b4159637673f3dc4d1d91557b374670f4a46c921e0b02ea7028f40e105

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b8e768b41596        b3fa191e8822        "/bin/sh -c 'cron -f'"   4 seconds ago       Up 3 seconds                            cocky_beaver

$ docker exec -ti b8e768b41596 bash
root@b8e768b41596:/code# tail -f /var/log/cron.log
Script has been started at 2019-03-13 00:06:01.095013
Script has been started at 2019-03-13 00:07:01.253030
Script has been started at 2019-03-13 00:08:01.273926
jpfvwuh4

jpfvwuh42#

这可能没有直接关系,但我的cronjob在Docker容器中运行时遇到了麻烦。我尝试了可接受的答案,但没有成功。我最终发现我用来编辑Crontab文件的编辑器(记事本++)被设置为Windows行尾(CR LF)。一旦我将其更改为Unix行尾(LF),cronjob就在Docker容器中成功运行了。

fdbelqdn

fdbelqdn3#

docker下使用传统的cron实现是很棘手的。考虑使用supercronic
docker-compose.yml

services:
  supercronic:
    build: .
    command: supercronic crontab

Dockerfile

FROM alpine:3.17
RUN set -x \
    && apk add --no-cache supercronic shadow \
    && useradd -m app
USER app
COPY crontab .

crontab
一个二个一个一个
更多的替代品可以在我的other answer中找到。

相关问题