今天是第二十五天!昨天我們成功整合了定時排程、SQLite 資料庫與大盤模組,完成了全自動化的盤後檢測與推播功能。
現在我們的 Telegram 機器人已經具備了完整的分析與自動化能力,但目前它依然運行在你的個人電腦上。一旦電腦關機、休眠或網路中斷,機器人就會立刻停止服務,定時推播也會隨之失效。
今天我們的目標,就是要將整個專案進行 Docker 容器化!透過撰寫 Dockerfile、.dockerignore 與 docker-compose.yml,把 Python 環境、套件依賴、SQLite 資料庫設定與程式碼打包成一個獨立的容器。這樣無論未來要部署到 AWS、GCP、DigitalOcean 還是 home server,都能實現「一鍵啟動、24 小時穩定運作」!
步驟一:先釐清邏輯
Docker 容器化的運作邏輯如下:
接下來,知道邏輯後,我們就可以來寫設定檔了!
步驟二:完整實作程式碼
在專案根目錄下新建並設定以下檔案:
Plaintext
python-telegram-bot>=20.0
yfinance>=0.2.0
pandas>=2.0.0
pandas-ta>=0.3.14b
apscheduler>=3.10.0
requests>=2.31.0
beautifulsoup4>=4.12.0
python-dotenv>=1.0.0
TELEGRAM_BOT_TOKEN=YOUR_TELEGRAM_BOT_TOKEN_HERE
CHAT_ID=YOUR_CHAT_ID_HERE
SCHEDULE_HOUR=14
SCHEDULE_MINUTE=30
__pycache__/
*.pyc
*.pyo
*.pyd
.git/
.gitignore
.env
venv/
.venv/
*.db
*.log
# 使用輕量級 Linux + Python 3.10 基礎鏡像
FROM python:3.10-slim
# 設定容器內工作目錄
WORKDIR /app
# 設定環境變數,防止 Python 產生 pyc 檔並確保 stdout 即時輸出 log
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 安裝系統層級必要依賴(編譯環境與時區設定)
RUN apt-get update && apt-get install -y --no-install-recommends \
tzdata \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 設定容器時區為台北時間 (Asia/Taipei)
ENV TZ=Asia/Taipei
# 複製依賴檔案並安裝
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 複製專案程式碼至容器內
COPY . .
# 容器啟動指令
CMD ["python", "main.py"]
version: '3.8'
services:
stock-bot:
build: .
container_name: taiwan_stock_telegram_bot
restart: always
env_file:
- .env
volumes:
# 持久化 SQLite 資料庫,避免容器重啟後自選股與快取遺失
- ./stock_cache.db:/app/stock_cache.db
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
解釋一下設定檔吧!
ENV TZ=Asia/Taipei:
這一步非常關鍵!因為 APScheduler 是根據系統時間來觸發 14:30 的盤後推播。如果容器時區預設是 UTC,推播時間就會相差 8 小時。設定 Asia/Taipei 能確保定時任務精準執行。
volumes: - ./stock_cache.db:/app/stock_cache.db:
這是 SQLite 持久化的核心!掛載 Volume 之後,容器內對 stock_cache.db 的讀寫都會直接寫入宿主機硬碟,就算更新 Docker 鏡像,使用者的自選股與快取資料依然完好無初。
restart: always:
當伺服器重啟或機器人遇到未預期的網路異常崩潰時,Docker 會自動嘗試重啟容器,達到高可用性。
步驟三:本地構建與執行測試
在專案根目錄開啟終端機,執行以下 Docker 指令:
docker-compose up -d --build
docker-compose ps
docker logs -f taiwan_stock_telegram_bot
docker-compose down
小結一下:
透過 Docker 容器化,我們成功解決了環境差異與資料丟失的隱患,並實現了排程時區的精準控制,
今天我們成功完成 Dockerfile 與 docker-compose.yml 的撰寫與本地容器化測試。