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 思路
-
系統中要安裝cron
預設基礎鏡像可能沒有安裝cron,是以需要apt-get install cron -y
-
配置cron指令
正常情況下,直接在伺服器中通過crontab -e 來編輯crontab;而實際部署服務的時候不合适手動添加cron指令,是以需要提前配置好crontab的檔案,并把它拷貝到鏡像 /var/spool/cron/crontabs/ 目錄下(該目錄下的檔案為cron服務預設存儲的位置,每個配置cron指令的使用者都會在該目錄下生成一個對應的檔案),格式為 /var/spool/cron/crontabs/user_name(若為root使用者則将user_name 更改為root即可)。
-
確定容器啟動時候運作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 中的指令打包鏡像,然後運作鏡像,測試效果。
