本文是 Dockerfile 編寫教程下半部分:Dockerfile 是應用一系列自定義的命令和格式構成文本文件從而簡化鏡像構建的過程。docker
一個容器只放一個應用網絡
在一個 Container 中安裝多個應用既使得鏡像更大又使得可讀性和邏輯性更差。因此相似一個函數只幹一件事的思想,一個 Container 也只應該放一個應用。app
合理使用 CMD 和 ENTRYPOINT 命令curl
CMD 和 ENTRYPOINT 都能用來指定開始運行的程序,並且這兩個命令都有兩種不用的語法:函數
CMD foo a b c
或者:優化
CMD [「foo」, 「a」, 「b」, 「c」]
對於第一種語法,docker 會自動加入「/bin/sh –c」到命令中,這樣就有可能致使意想不到的行爲。爲了不這種行爲,咱們推薦全部的 CMD 和 ENTRYPOINT 都應該使用第二種語法。
若是兩個同時使用,請肯定肯定他們的含義沒有錯誤。通常來講須要兩個同時使用的狀況只有 ENTRYPOINT 指定須要運行的 binary,CMD 給出運行的默認參數。url
挑選合適的基礎鏡像操作系統
一個合適的基礎鏡像是能知足運行應用所須要的最小的鏡像。這裏包括code
若是不須要操做系統,那麼使用 scratch 鏡像就好;能使用小的鏡像就不要使用大的。教程
指定的基礎鏡像須要有版本號,好比 debian 就有不少不一樣的版本。不指定版本號就永遠用的 latest,這個會一直變。由於不一樣版本的系統和安裝的軟件有兼容性問題,因此不指定版本會使得 Dockerfile 不穩定。
若是多個鏡像須要安裝一系列相同的軟件,那麼能夠考慮新建一個基礎鏡像來安裝這些軟件。之後的鏡像直接使用新生成的基礎鏡像就好
優化 apt-get 相關操做
將多個 apt-get 操做合成一個既能減小 layer 數,又能更好的管理安裝的東西(避免重複安裝)。在 apt-getinstall 以前,最好使用 apt-getupdate 這樣能夠保證安裝的程序是最新版本的。在安裝完以後最好使用 apt-get clean 來清理中間結果。下面給出了一個比較推薦的 apt-get 操做的格式:
RUN apt-get update && apt-get install -y \ package-bar \ package-baz \ package-foo && \ apt-get clean
須要安裝的軟件最好按字母序排列,這樣之後要查找或者增長新的軟件方便。
合理使用ADD 命令
一、ADD命令和 COPY 命令在很大層度上功能是同樣的。可是 COPY 語義更加直接,因此咱們推薦儘可能使用 COPY 命令。惟一例外的是 ADD 命令自帶解壓功能,若是須要拷貝並解壓一個文件到鏡像中,那麼咱們可使用 ADD 命令。除此以外,咱們都推薦使用 COPY 命令。
二、
ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things all
咱們不推薦使用 ADD 命令來獲取網絡資源。網絡資源應該使用 RUN wget 或者 curl 命令來獲取。由於使用 wget 或者 curl 更加方便清理存儲的中間文件和臨時文件,同時這樣也能使用更少的 layer 來完成一樣的事情。好比命令:
能夠由如下命令代替:
RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all
不要設置公共端口
Dockerfile 支持 mapping 私有端口和公共端口(好比命令 EXPOSE 80:8080),可是咱們不推薦 mapping 公共端口由於 Container 在編譯的時候沒法肯定這個公共端口在它運行的環境中是否已經被其餘程序佔用。
清理沒用的中間結果
中間結果能夠包括:
安裝的對最後應用沒有的軟件。好比安裝 foo 須要軟件 bar,可是最後的應用不須要 bar。那麼在安裝完成 foo 以後就能夠把 bar 刪了。
拷貝的臨時文件
安裝產生的中間結果
若是須要轉載,請聯繫咱們,尊重知識產權人人有責;0