在 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
後安裝
為了繼續使用特定版本,可以透過以下方式處理:
使用 Debian Snapshot 下載對應的
.deb
- 前往 Debian Snapshot
- 搜尋對應的 Apache2 版本(例如
apache2_2.4.62-xxxx_amd64.deb
) - 下載
.deb
檔案,和其他可能需要的依賴檔案 - 建議將
.deb
備份到自己可控的檔案伺服器或雲端空間,避免未來再次被移除
修改 Dockerfile
- 先將
.deb
檔放到自有空間,再在 Dockerfile 中下載並安裝
- 先將
Dockerfile 實作範例
以下是一個簡化的範例:
1 | FROM debian:bullseye |
這樣即使官方套件庫移除了該版本,你依然能透過 .deb
安裝到指定版本的 Apache,並且掌握版本來源。
注意事項
依賴問題:
安裝.deb
可能會遇到依賴套件的問題,需要一併下載並安裝相容的版本。檔案管理:
建議將.deb
存放在團隊可控的空間(如內部檔案伺服器、AWS S3),避免依賴外部來源再度消失。
結論
在 Dockerfile 中綁定特定版本雖然能確保一致性,但也可能因為版本被下架導致部署失敗。
透過 Debian Snapshot 下載 .deb
並放到自己的空間進行管理 是一個快速、可控的解決辦法,特別適合舊專案維護時無法投入太多時間處理升級的情境。