iT邦幫忙

0

🐳 在 Windows Docker 跑 Cronicle:我的完整排錯紀錄

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250821/2015510366kD17DiDV.png

前篇文章我在正式的Ubuntu環境架了Cronicle

🚀 起點:我想在 Windows 跑 Linux 版 Cronicle

我原本在 Windows 裝好了 Docker,想要直接用官方提供的 Linux 版 Cronicle 容器
一開始看著文件照做,結果一路踩坑:Port 被佔用、容器一直 Restart、JSON 壞掉、Shell Script 無法執行,最後還遇到 Email 發不出去。
這篇文章就是把整個過程完整記錄下來。


🛠️ 使用 Docker 安裝 Linux 版 Cronicle 的步驟

在 Windows 上要跑 Cronicle,流程大致如下:

  1. 建立一個專案資料夾:

    mkdir C:\cronicle && cd C:\cronicle
    
  2. 建立一份 docker-compose.yml

    services:
      cronicle:
        image: soulteary/cronicle:latest
        container_name: cronicle
        ports:
          - "13012:3012"         # 改成不會衝突的 Port
        environment:
          - TZ=Asia/Taipei
        volumes:
          - ./data/data:/opt/cronicle/data:rw
          - ./data/logs:/opt/cronicle/logs:rw
          - ./data/plugins:/opt/cronicle/plugins:rw
        restart: unless-stopped
    
  3. 啟動容器:

    docker compose up -d
    
  4. 開啟瀏覽器進入管理介面:

    http://localhost:13012
    

    預設帳密是 admin / admin,建議第一次登入就立刻修改。


📂 修改 docker-compose.yml 並新增 scripts、backups 資料夾

後來我需要讓 Cronicle 自動備份自己,所以額外新增了兩個 volume:

  • scripts → 放備份腳本
  • backups → 存放備份輸出

更新後的 docker-compose.yml

services:
  cronicle:
    image: soulteary/cronicle:latest
    container_name: cronicle
    ports:
      - "13012:3012"
    environment:
      - TZ=Asia/Taipei
    volumes:
      - ./data/data:/opt/cronicle/data:rw
      - ./data/logs:/opt/cronicle/logs:rw
      - ./data/plugins:/opt/cronicle/plugins:rw
      - ./scripts:/opt/cronicle/scripts:ro
      - ./backups:/opt/cronicle-backup:rw
    restart: unless-stopped

在 Windows 上建立對應的資料夾:

mkdir C:\cronicle\scripts -ea 0
mkdir C:\cronicle\backups -ea 0

這樣 Cronicle 的備份腳本就可以放在 C:\cronicle\scripts,執行後備份檔會自動出現在 C:\cronicle\backups


🔌 Port 被佔用的第一關

一開始我用 docker compose up -d,馬上爆錯:

Ports are not available: exposing port TCP 0.0.0.0:3012

查了一下,原來 3012 已被另一個程式或舊容器佔用

👉 解法有兩個:

  1. 找出 PID,停掉舊容器或程式。
    netstat -ano | findstr :3012
    tasklist /fi "PID eq <PID>"
    docker stop cronicle && docker rm cronicle
    
  2. 直接改成另一個 port(例如 13012)。
    ports:
      - "13012:3012"
    

🔄 Restart Loop:容器起不來

Port 問題解掉後,容器又進入 Restarting (1) 狀態。
原因有幾種:

  • Windows 掛載目錄權限不足
  • volumes 資料夾結構錯誤
  • JSON 配置檔壞掉

修正方式

我把 docker-compose.yml 改成官方建議的結構:

volumes:
  - ./data/data:/opt/cronicle/data:rw
  - ./data/logs:/opt/cronicle/logs:rw
  - ./data/plugins:/opt/cronicle/plugins:rw

然後先手動建立資料夾:

mkdir C:\cronicle\data\data -ea 0
mkdir C:\cronicle\data\logs -ea 0
mkdir C:\cronicle\data\plugins -ea 0

果然,容器不再自動重啟了。


⚠️ JSON 損壞:config.json 啟動失敗

有一次我直接修改容器內的 /opt/cronicle/conf/config.json,結果因為 JSON 多了一個逗號,整個 Cronicle 啟不來。

錯誤訊息:

SyntaxError: Unexpected token in JSON

👉 最快的解法:
直接把壞掉的檔刪掉,Cronicle 會自動重建一份乾淨的。

cp /opt/cronicle/sample_conf/config.json /opt/cronicle/conf/config.json
docker restart cronicle

📑 將 config.json 改成 volume 載入

為了避免之後再手動進容器修改,我把 config.json 拉出來掛到主機上。

步驟如下:

  1. 從容器把原始檔拉到本地:

    docker cp cronicle:/opt/cronicle/conf/config.json ./conf/config.json
    
  2. docker-compose.yml 裡新增掛載:

    - ./conf/config.json:/opt/cronicle/conf/config.json:ro
    
  3. 下次需要修改,只要在本地編輯 conf/config.json,然後 docker compose up -d 重啟就能套用。

這樣做的好處是方便管理版本,也不怕誤動容器內的檔案。


📦 自動備份:Cronicle 備份自己的排程

我寫了一支簡單的 shell script,讓 Cronicle 自己每天凌晨備份:

#!/bin/sh
BACKUP_DIR="/opt/cronicle-backup"
SOURCE_DIR="/opt/cronicle/data"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/cronicle_backup_${TIMESTAMP}.tar.gz"

mkdir -p "${BACKUP_DIR}"
tar -czf "${BACKUP_FILE}" -C "${SOURCE_DIR}" .
find "${BACKUP_DIR}" -type f -name "*.tar.gz" -mtime +7 -delete

再把它掛到容器:

- ./scripts:/opt/cronicle/scripts:ro
- ./backups:/opt/cronicle-backup:rw

在 Cronicle UI 建立一個 Shell Script Job

  • Command:
    #!/bin/sh
    /opt/cronicle/scripts/cronicle_backup.sh
    
  • Schedule: 每天 00:05

最後備份檔就會自動出現在 C:\cronicle\backups\ 了。


📧 Email 報錯:ECONNREFUSED 127.0.0.1:25

某次 Job 報錯:

Failed to send e-mail for job ... ECONNREFUSED 127.0.0.1:25

這代表 Cronicle 嘗試用 本機 port 25 寄信,但我沒有 SMTP server。

👉 解法是修改 config.json 改用外部 SMTP,例如 Gmail:

{
  "smtp_hostname": "smtp.gmail.com",
  "smtp_port": 587,
  "mail_options": {
    "secure": false,
    "auth": {
      "user": "your-email@gmail.com",
      "pass": "your-app-password"
    }
  }
}

✅ 最終總結

一路下來,我的心得是:

  1. Port 問題 → 換掉或停用舊程式。
  2. Restart Loop → 九成是 volumes 結構或權限錯。
  3. JSON 壞掉 → 直接刪掉讓 Cronicle 重建。
  4. config.json 改 volume → 管理更方便。
  5. Shell Script Job → 用 #!/bin/sh 包裝最穩。
  6. Email 寄不出去 → 改 config.json 指向外部 SMTP。

現在我的 Cronicle 在 Windows Docker 上跑得很穩,每天會自動備份,Job 出錯也能發通知。


🧾 適合詢問 GPT 的 Prompt

  • 「Cronicle Docker 容器一直 Restarting,要怎麼檢查錯誤?」
  • 「在 Windows Docker 掛載 volume,權限問題要怎麼排查?」
  • 「Cronicle Job 的 Shell Script 報錯 spawn -8,該怎麼解?」
  • 「如何在 Cronicle 裡設定 Gmail SMTP 寄信?」
  • 「怎麼讓 Cronicle 自動備份自己的資料夾?」


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言