簡體   English   中英

Crontab 似乎在 Docker 容器中不起作用

[英]Crontab doesn't seem to work within Docker container

我正在嘗試在 Docker 容器中運行 Crontab。 Docker 容器基於 Centos7。 我有一個 python 文件,我需要在 Docker 容器中每 2 分鍾運行一次。

我已經在容器中安裝了 Python3、Crontab 和所有依賴項。 當我嘗試在容器中運行: /usr/bin/python3 /home/centos/pipeline_trigger/cron-trigger.py ,我得到了預期的結果。

但是,即使我設置了 crontab,它也不會運行 python 文件。

我遵循的步驟:

  1. 運行crontab -e並輸入 cron 持續時間和動作。

    在此處輸入圖片說明

  2. 保存文件並獲得輸出為: crontab: installing new crontab

  3. 即使在 2 或 4 分鍾后,cronjob 也不會觸發 python 文件。

在此處輸入圖片說明

Crontab 版本: cronie-1.4.11-23.el7.x86_64

有誰知道如何獲得預期的結果?

crontab 由cron守護進程運行。 在普通系統中(不是 Docker 容器,例如 LXC、systemd-nspawn、VMs、FreeBSD Jails、真機),用戶空間以init開頭,它是服務管理器。 服務管理器啟動各種守護進程,例如sshd (SSH Server)、 getty (TTY登錄提示)、 cron (定時任務守護進程)等。

另一方面,Docker 容器不會以這種方式啟動。 容器沒有服務管理器,它們在構建 Docker 鏡像時直接在ENTRYPOINTCMD命令中運行您指定的二進制文件和參數。 例如,Java 容器將運行/usr/bin/java作為其ENTRYPOINT 因此,運行 crontab 任務的守護進程cron根本不會啟動。

如果你依賴一個 Docker 容器中的多個進程,一個常見的方法是為你的 ENTRYPOINT 編寫一個啟動腳本。 該腳本將啟動所有守護進程。 也有框架可以做到這一點。

另外,請確保您的 crontab 安裝在 Dockerfile 中。 由於 Docker 容器是不可變的,因此當您刪除容器時,未按卷掛載在正在運行的容器中的文件中的任何更改都將丟失。

實際上,我的 Python 文件在使用open('directory/file location')出錯了,我給出了錯誤的路徑。

在運行crontab -e並添加*/2 * * * * /usr/bin/python3 /home/centos/pipeline_trigger/cron-trigger.py >> /tmp/trigger.log 2>&1后,我能夠找到問題

它給了我正確的錯誤信息,當我給出正確的路徑時,它起作用了!

現在 cron 作業在容器內完美運行。

在 dockerfile 中添加了以下內容:

RUN touch /var/spool/cron/root \
&& echo -e "30 4 * * * /usr/bin/python3 /home/centos/pipeline_trigger/cron-trigger.py >> /tmp/pipeline_trigger.log 2>&1 >> /var/spool/cron/root

通過這種方式,在創建 Docker 映像本身時設置了 cron,我所要做的就是運行容器。 無需通過爭論。

碼頭檔案:

FROM centos:7 as base
WORKDIR /home

RUN yum update -y \
&& yum install sudo -y \
&& yum install docker -y \
&& yum install openssh-server -y \
&& yum install -y openssh-clients \
&& yum install -y epel-release \
&& yum install git -y \
&& yum install python3 -y \
&& yum install cronie -y



FROM base as configure
WORKDIR /home

RUN sudo useradd centos \
&& echo password | passwd centos --stdin \
&& echo "centos        ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers \
&& sudo sed -i "/^[^#]*PasswordAuthentication[[:space:]]no/c\\PasswordAuthentication yes" /etc/ssh/sshd_config \



FROM configure as pipelinetrigger
WORKDIR /home/centos/pipeline_trigger/
COPY cron-trigger.py ./cron-trigger.py

RUN touch /var/spool/cron/root \
&& echo -e "30 4 * * * /usr/bin/python3 /home/centos/pipeline_trigger/cron-trigger.py >> /tmp/pipeline_trigger.log 2>&1" >> /var/spool/cron/root

ENTRYPOINT /usr/sbin/init
CMD ["systemctl","restart","sshd.service"]

搞定了感謝你的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM