背景
公司新開了某個項目,我在新的服務器部署了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鏡像存儲的服務,或者自己搭建服務器,自己的軟件源自己用的省心...
