iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
Software Development

30 天打造專屬盯盤機器人:資料爬取、策略指標到 Telegram/LINE 推播系列 第 25 篇

Day 25:邁向雲端 24 小時不間斷運作 — Docker 容器化打包實戰!

  • 分享至 

  • xImage
  •  

今天是第二十五天!昨天我們成功整合了定時排程、SQLite 資料庫與大盤模組,完成了全自動化的盤後檢測與推播功能。

現在我們的 Telegram 機器人已經具備了完整的分析與自動化能力,但目前它依然運行在你的個人電腦上。一旦電腦關機、休眠或網路中斷,機器人就會立刻停止服務,定時推播也會隨之失效。

今天我們的目標,就是要將整個專案進行 Docker 容器化!透過撰寫 Dockerfile、.dockerignore 與 docker-compose.yml,把 Python 環境、套件依賴、SQLite 資料庫設定與程式碼打包成一個獨立的容器。這樣無論未來要部署到 AWS、GCP、DigitalOcean 還是 home server,都能實現「一鍵啟動、24 小時穩定運作」!

步驟一:先釐清邏輯
Docker 容器化的運作邏輯如下:

  • 定義環境與依賴(Dockerfile):指定輕量級的 Python 基礎鏡像(Base Image),設定工作目錄,安裝套件並指定啟動指令。
  • 持久化資料卷綁定(Volume Mounting):因為 SQLite 資料庫(stock_cache.db)儲存了使用者的自選股清單與快取資料,我們必須將容器內的資料庫檔案映射到宿主機(Host)的硬碟上,確保容器重新啟動或更新時,資料不會丟失!
  • 環境變數隔離(.env 與 config.py):將 Telegram Bot Token 等敏感資訊抽出至 .env 檔案中,避免直接寫死在程式碼或打包進鏡像。
  • 一鍵部署管理(docker-compose.yml):使用 Docker Compose 設定服務、環境變數與 Volume,實現單一指令即可完成構建與背景啟動。

接下來,知道邏輯後,我們就可以來寫設定檔了!

步驟二:完整實作程式碼
在專案根目錄下新建並設定以下檔案:

  1. requirements.txt
    確保專案根目錄的 requirements.txt 包含至今所需的所有套件:

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
  1. .env
    建立 .env 檔案,用來存放敏感金鑰:
TELEGRAM_BOT_TOKEN=YOUR_TELEGRAM_BOT_TOKEN_HERE
CHAT_ID=YOUR_CHAT_ID_HERE
SCHEDULE_HOUR=14
SCHEDULE_MINUTE=30
  1. .dockerignore
    建立 .dockerignore,避免將本機的虛擬環境、暫存檔或資料庫打包進 Docker Image:
__pycache__/
*.pyc
*.pyo
*.pyd
.git/
.gitignore
.env
venv/
.venv/
*.db
*.log
  1. Dockerfile
    建立 Dockerfile:
# 使用輕量級 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"]
  1. docker-compose.yml
    建立 docker-compose.yml:
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 指令:

  1. 構建並在背景啟動容器
docker-compose up -d --build
  1. 查看容器運行狀態
docker-compose ps
  1. 即時查看機器人運作 Log
docker logs -f taiwan_stock_telegram_bot
  1. 停止容器指令
docker-compose down

小結一下:
透過 Docker 容器化,我們成功解決了環境差異與資料丟失的隱患,並實現了排程時區的精準控制,
今天我們成功完成 Dockerfile 與 docker-compose.yml 的撰寫與本地容器化測試。


上一篇
Day 24:全自動化里程碑 — 整合大盤與自選股的全自動盤後推播系統!
系列文
30 天打造專屬盯盤機器人:資料爬取、策略指標到 Telegram/LINE 推播 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言