在 Docker 中安裝被下架的 Apache 版本

前言

在最近舊專案部署過程中,遇到了一個問題:
原本在 Dockerfile 裡透過 apt install 指定安裝特定版本的 Apache,一直以來都能正常運作,但某天突然失效,系統回報找不到該版本。深入追查後,才發現 指定的 Apache 版本已經從官方套件庫中下架

因為是舊專案,不太能安排時間有效去處理升級或版本調整,所以這裡採用一個簡單的方式:透過 Debian Snapshot 下載 .deb 檔,並放到自己管理的空間,再透過 apt install 指定路徑安裝。這樣可以避免未來套件庫再次下架導致部署失敗


問題重現

原本在 Dockerfile 中的寫法如下:

1
RUN apt-get update && apt-get install -y apache2=2.4.62-xxxx

但在 build 的過程卻出現錯誤訊息:

1
E: Version '2.4.62-xxxx' for 'apache2' was not found

這代表該版本已經不在套件庫中


為什麼會發生?

APT 套件庫並不會永久保存所有版本,某些舊版本會隨著安全更新或系統版本更新而 被移除或替換
如果你的 Dockerfile 鎖定了特定版本(例如為了避免更新造成行為差異),那麼當這個版本從套件庫中下架時,apt install 就會失敗。


解決方案:透過 Debian Snapshot 下載 .deb 後安裝

為了繼續使用特定版本,可以透過以下方式處理:

  1. 使用 Debian Snapshot 下載對應的 .deb

    • 前往 Debian Snapshot
    • 搜尋對應的 Apache2 版本(例如 apache2_2.4.62-xxxx_amd64.deb
    • 下載 .deb 檔案,和其他可能需要的依賴檔案
    • 建議將 .deb 備份到自己可控的檔案伺服器或雲端空間,避免未來再次被移除
  2. 修改 Dockerfile

    • 先將 .deb 檔放到自有空間,再在 Dockerfile 中下載並安裝

Dockerfile 實作範例

以下是一個簡化的範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM debian:bullseye

# 更新套件清單
RUN apt update && apt install -y wget

# 從 Debian Snapshot 下載指定版本 Apache deb,或者自己管理的空間
RUN wget https://snapshot.debian.org/archive/debian/20240801T000000Z/pool/main/a/apache2/apache2_2.4.62-xxxx_amd64.deb

# 安裝指定版本
RUN apt install -y ./apache2_2.4.62-xxxx_amd64.deb

# 清理暫存檔案
RUN rm apache2_2.4.62-xxxx_amd64.deb

這樣即使官方套件庫移除了該版本,你依然能透過 .deb 安裝到指定版本的 Apache,並且掌握版本來源。


注意事項

  • 依賴問題
    安裝 .deb 可能會遇到依賴套件的問題,需要一併下載並安裝相容的版本。

  • 檔案管理
    建議將 .deb 存放在團隊可控的空間(如內部檔案伺服器、AWS S3),避免依賴外部來源再度消失。


結論

在 Dockerfile 中綁定特定版本雖然能確保一致性,但也可能因為版本被下架導致部署失敗。
透過 Debian Snapshot 下載 .deb 並放到自己的空間進行管理 是一個快速、可控的解決辦法,特別適合舊專案維護時無法投入太多時間處理升級的情境。

Reference