天天看點

docker筆記9--Docker鏡像中使用crontab

docker筆記9--Docker鏡像中使用crontab

  • ​​1 介紹​​
  • ​​2 打包方法​​
  • ​​2.1 思路​​
  • ​​2.2 案例​​
  • ​​3 測試​​
  • ​​4 說明​​

1 介紹

工作中經常會使用cron,實體機上使用非常簡單,但是大部分docker容器中預設沒有cron且沒有啟動cron服務,直接使用不太友善。是以,筆者根據日常經驗,将cron服務打包到docker鏡像中,實作容器啟動後定時執行cron中的任務。

該方法僅僅在ubuntu系統中測試過,其它系統中crontab儲存的路徑是否為/var/spool/cron/crontabs/筆者暫未逐一測試。若使用其它基礎系統,建議先确認crontab的儲存路徑後,再參考筆者方法加以修改。

2 打包方法

2.1 思路

  1. 系統中要安裝cron

    預設基礎鏡像可能沒有安裝cron,是以需要apt-get install cron -y

  2. 配置cron指令

    正常情況下,直接在伺服器中通過crontab -e 來編輯crontab;而實際部署服務的時候不合适手動添加cron指令,是以需要提前配置好crontab的檔案,并把它拷貝到鏡像 /var/spool/cron/crontabs/ 目錄下(該目錄下的檔案為cron服務預設存儲的位置,每個配置cron指令的使用者都會在該目錄下生成一個對應的檔案),格式為 /var/spool/cron/crontabs/user_name(若為root使用者則将user_name 更改為root即可)。

  3. 確定容器啟動時候運作cron服務

    預設情況下cron服務沒有啟動,是以需要在容器啟動指令中手動添加一個service cron start 來啟動cron服務。

2.2 案例

本案例基于ubuntu系統,安裝python3,部署一個基礎flask app,并且每分鐘都将系統目前時間寫入/home/flask/dt.txt 中。

該案例依賴 app.py Dockerfile readme.md root 等4個檔案。

app.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_root():
    print('v1.2 Hello Root!\n')
    return 'v1.2 Hello Root!\n'


@app.route('/hello')
def hello_world():
    print('v1.2 Hello World!\n')
    return 'v1.2 Hello World!\n'


if __name__ == '__main__':
    app.run(host='0.0.0.0')      

root

* * * * * date >/home/flask/dt.txt      

Dockerfile

FROM ubuntu:20.04
RUN mkdir -p /home/flask
WORKDIR /home/flask
COPY app.py .
COPY root /var/spool/cron/crontabs/root
# COPY sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install cron -y && apt-get install curl -y && apt-get install python3 -y && apt-get install python3-pip -y && pip3 install flask
CMD  service cron start &&      

readme.md

# ubuntu_cron
docker build -t ubuntu_cron:v1.0 .
docker run --name=ubuntu_cron -d -p 5000:5000 ubuntu_cron:v1.0
docker tag ubuntu_cron:v1.0 dockerhub.xxx.com/xg/ubuntu_cron:v1.0      

3 測試

通過上述readme.md 中的指令打包鏡像,然後運作鏡像,測試效果。

docker筆記9--Docker鏡像中使用crontab

4 說明