記錄線上與本地docker鏡像一致,但Dockerfile卻構建失敗的問題


背景

公司新開了某個項目,我在新的服務器部署了docker環境,本着ctrl+c 和ctrl+v的慣例,直接把以前的php環境的Dockerfile文件直接復制到新項目服務器那里,結果構建失敗,失敗的原因是某個軟件包(如libpng12-dev)不存在,其中一個報錯如下:

E: Package 'libpng12-dev' has no installation candidate

這時候我心里響起無數個草泥馬,為什么以前的環境就沒問題(同樣都是php:7.1-fpm),網上查了一下資料,說這個包在ubuntu16已經不存在了,用libpng-dev。

這時候我還沒有醒悟過來什么回事,直接把原來安裝的包替換成新版本的包,但是之后會出現安裝到某些本該有的包的時候還是找不到的情況。

解決

懷疑鏡像源的問題

試着在自己的vpn(ubuntu16環境)上面試了一下apt-cache search同樣的包,是可以找到,於是懷疑是不是國內的鏡像源的問題,是不是清華的軟件源抽風了,把Dockerfile里的替換國內的鏡像的命令去掉。

#COPY sources.list /etc/apt/sources.list

結果世界一下子清靜了,docker構建成功,然后我又情不自禁感嘆國內的開發環境真一般的時候,殊不知這其實是自己的無知引起的。

再次解決問題

由於本地的網速實在一般,連接外國的軟件源下載得賊慢,構建一個環境幾乎需要2個小時,實在受不了,打算換一個鏡像源,但是該換debian的哪一版本鏡像源呢?這時候需要用lsb_release -a 查看一下就好了,在docker環境下查到是debian9,然后換上163的軟件源,一切又正常了,對比原來的軟件源鏈接,這時候我才意識到應該是應該是php鏡像的內核升級了,從debian8換成了debian9....而不同版本的鏡像源是不一樣的,所以才會出現某些包不存在的情況
下面附上debian9的163源:

deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib

結論

docker的基礎軟件鏡像很有可能會升級內核環境,其實學習過linux的人都知道對軟件的升級不一定是好事,可能新版本的軟件穩定性還沒有舊的好,因此如果線上的環境沒有什么特殊需求,應當盡可能地避免升級,docker也是同理,但是由於本人是直接從公共源拉下來的鏡像,這期間和你上次開發的環境相比,內核的改變也是不可預料的,這其中也會引起和你的Dockerfile不兼容的問題,因此如果是有條件的話,盡可能自己購買docker鏡像存儲的服務,或者自己搭建服務器,自己的軟件源自己用的省心...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM