[英]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 文件。
我遵循的步驟:
運行crontab -e
並輸入 cron 持續時間和動作。
保存文件並獲得輸出為: crontab: installing new crontab
即使在 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 鏡像時直接在ENTRYPOINT
或CMD
命令中運行您指定的二進制文件和參數。 例如,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.