iT邦幫忙

2026 iThome 鐵人賽

DAY 13
0
Build on Google AI

打造零成本企業級 AI Agent:以 Gemini 2.5 Flash 構建金融分析助手與維運實戰系列 第 13

【Day 13】容器化與服務化:Podman Containerfile 撰寫與 Systemd 託管 (angelina.service)

  • 分享至 

  • xImage
  •  

「在 RHEL 企業級 Linux 環境中,使用 Podman 進行無 Root (Rootless) 容器化,並透過 Systemd 實現開機自啟與服務自癒,才是符合 Production-Ready 標準的終極部署架構。」

在 Day 12 中,我們實作了 /health 與 /stats 監控 API,並將其與 Ansible 巡檢進行整合。今天我們將進入核心部署章節——使用 Podman 撰寫 Containerfile 進行應用程式容器化,並透過 Systemd (angelina.service) 實現服務化託管!

為了符合企業級 Linux 的安全性要求,我們不採用傳統 Docker 的 Root 權限守護進程,而是使用 RHEL 原生的 Podman 進行非 Root 容器打包與管理。

本篇重點摘要

  1. 為什麼選擇 Podman + Containerfile 而非 Docker?
  2. 拆解 Containerfile 多階段建置想法與 Python 輕量化映像檔最佳化。
  3. 剖析 .containerignore 檔案過濾機制,避免敏感憑證與大檔傳入 Build Context。
  4. 實作 angelina.service Systemd 設定檔:開機自動啟動、自動重啟與健康檢查。

一、Podman 容器化設計 (Containerfile)

在 RHEL 系統上,Containerfile 是 Podman 的標準容器建構檔。我們採用 Python 官方輕量映像檔,設定工作目錄為 /opt/angelina,並預先建立日誌與數據目錄:

Dockerfile
# Containerfile
FROM python:3.11-slim

# 設定環境變數:停用 Python 緩衝與 Pyc 寫入
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1

WORKDIR /opt/angelina

# 建立日誌與數據持久化目錄
RUN mkdir -p /var/log/angelina /opt/angelina/data /opt/angelina/config

# 複製並安裝依賴套件
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 複製應用程式原始碼與靜態資源
COPY app/ ./app/
COPY static/ ./static/

# 暴露 FastAPI 預設埠號 8080
EXPOSE 8080

# 啟動 Uvicorn 服務
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

二、檔案過濾與安全防範 (.containerignore)

為了確保打包映像檔時不會將敏感金鑰(如 service-account.json)、SQLite 資料庫(conversations.db)或巨大的向量檔案包含進去,我們在專案根目錄建立了 .containerignore:

# .containerignore
.git
.gitignore
__pycache__
*.pyc
*.pyo
*.pyd
.env
data/
config/service-account.json
var/log/
.venv/
這不僅大幅縮小了容器映像檔的體積,更防止了敏感金鑰意外打包至映像檔中的資安風險。

三、Systemd 服務託管 (deploy/angelina.service)

為了讓容器能在 RHEL 伺服器開機時自動啟動,並在發生 crash 時自動恢復,我們將 Podman 容器包裝為 Systemd 服務(angelina.service):

[Unit]
Description=Angelina AI Financial Expert Agent Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/angelina
ExecStartPre=-/usr/bin/podman stop angelina
ExecStartPre=-/usr/bin/podman rm angelina
ExecStart=/usr/bin/podman run --rm --name angelina \
  -p 8080:8080 \
  -v /opt/angelina/data:/opt/angelina/data:Z \
  -v /opt/angelina/config:/opt/angelina/config:Z \
  -v /var/log/angelina:/var/log/angelina:Z \
  angelina-agent:latest

ExecStop=/usr/bin/podman stop -t 10 angelina
Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target

關鍵語法解析:

  1.-v ...:Z 標籤:在 RHEL 開啟 SELinux 的環境下,:Z 標籤會自動為掛載目錄重寫 SELinux 安全上下文,防止 Podman 因權限不足無法讀寫資料庫與日誌。
  2.ExecStartPre 預先清理:確保每次啟動服務前,都會先停止並移除舊的殘留容器,保證啟動狀態的乾淨。
  3.Restart=always:服務崩潰時會在 10 秒內自動重啟,實現真正的無人值守運維。

四、今日總結

透過 Containerfile 與 angelina.service 的結合,我們完成了生產環境部署的最後一塊拼圖:

  1. 環境一致性:無論是開發測試機還是 RHEL 生產伺服器,透過 Podman 容器能保證 Python 依賴與系統環境 100% 相同。
  2. SELinux 安全相容:透過正則的 Volume 掛載與 :Z 標籤,兼顧了 RHEL 的極致安全性與儲存持久化。
  3. 開機自啟與自癒:Systemd 託管確保了服務在開機、重啟或崩潰時能自動復原。

明天(Day 14)我們將進入 deploy/deploy.sh 一鍵部署腳本實作,探討如何整合 Git pull、Podman build 與 Systemd reload,實現完全自動化的 CI/CD 部署流程!

明日預告:【Day 14】自動化部署管線:deploy.sh 腳本實作與 CI/CD 流程整合


上一篇
【Day 12】系統全監控:/health 與 /stats API 實作與 Ansible 巡檢整合
下一篇
【Day 14】自動化部署管線:deploy.sh 腳本實作與 CI/CD 流程整合
系列文
打造零成本企業級 AI Agent:以 Gemini 2.5 Flash 構建金融分析助手與維運實戰15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言