1、使用.dockerignore檔案
早多數情況下,最好把dockerfile放在乙個空的目錄中,然後在該目錄中新增所需要的檔案,為了提高構建的效能,可以通過新增.dockerignore來排除一些檔案
怎麼建立乙個.dockerignore檔案,可以參考該文件.dockerignore
2、避免安裝不必要檔案包
3、每個容器都應該只實現乙個功能
4、最小化層
5、對多行引數進行排序
run apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
6、構建快取
1、from
使用官方庫作為基礎映象,建議使用debian映象,因為他是非常嚴格控制和保持映象最小,而且它又是完整的發行版。
2、lable
可以通過新增lable的方式來根據專案組織映象,記錄許可資訊,以幫助自動化。設定映象的元資料資訊
label指令擁有為映象新增一些描述的元資料。label是一系列的鍵值對,它的格式如下:對於每個label,用lable標誌開始一行,並新增乙個或多個鍵值對,例如:
# set one or more individual labels
label com.example.version="0.0.1-beta"
label vendor="acme incorporated"
label com.example.release-date="2015-02-12"
label com.example.version.is-production=""
# set multiple labels on one line
label com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"
# set multiple labels at once, using line-continuation characters to break long lines
label vendor=acme\ incorporated \
com.example.is-beta= \
com.example.is-production="" \
com.example.version="0.0.1-beta" \
com.example.release-date="2015-02-12"
通過docker inspect命令,可以檢視映象中的標籤資訊。
3、run
為了使得映象檔案更加易讀,易於理解和更可維護性,可以在使用反斜槓分隔的多行上拆分或複雜的run語句,始終將軟體包更新和安裝命令結合在同乙個語句中。最好將不同命令使用&&結合在同乙個命令中
run apt-get update && apt-get install -y \
aufs-tools \
automake \
build-essential \
curl \
dpkg-sig \
libcap-dev \
libsqlite3-dev \
mercurial \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.* \
&& rm -rf /var/lib/apt/lists/*
4、cmd
cmd指令應該伴隨其他引數被用來執行映象中的軟體容器,cmd大都這樣使用 cmd [「executable」, 「param1」, 「param2」…],cmd即容器在跑起來時執行的命令
5、expose
將容器中的某埠暴露出來。
6、env
為了使新的軟體能夠更加便利的執行,我們能夠使用env指令來更新path的環境變數,例如定義env path /usr/local/nginx/bin:$path 之後才可以確保cmd [「nginx」]的正常執行
最後env還可以設定通用的版本號以防版本波動
env pg_major 9.3
env pg_version 9.3.4
run curl -sl | tar -xjc /usr/src/postgress && …
env path /usr/local/postgres-$pg_major/bin:$path
7、add or copy
儘管add和copy在功能上相似,但一般來說,copy是優選的。那是因為它比add更透明。 copy僅支援將本地檔案基本複製到容器中,而add具有一些功能(如僅限本地的tar提取和遠端url支援),這些功能並不是很明顯。因此,add的最佳用途是將本地tar檔案自動提取到影象中,如add rootfs.tar.xz /中所示。
如果您有多個使用上下文中不同檔案的dockerfile步驟,請單獨複製它們,而不是一次複製它們。這將確保每個步驟的構建快取僅在特定需要的檔案更改時失效(強制重新執行該步驟)。
copy requirements.txt /tmp/
run pip install --requirement /tmp/requirements.txt
copy . /tmp/
與放置copy相比,run步驟的快取失效次數更少。 / tmp /之前。
由於影象大小很重要,因此強烈建議不要使用add從遠端url中提取包。你應該使用curl或wget代替。這樣,您可以刪除提取後不再需要的檔案,也不必在影象中新增其他圖層。例如,你應該避免做以下事情:
add /usr/src/things/
run tar -xjf /usr/src/things/big.tar.xz -c /usr/src/things
run make -c /usr/src/things all
你應該這樣
run mkdir -p /usr/src/things \
&& curl -sl \
| tar -xjc /usr/src/things \
&& make -c /usr/src/things all
8、entrypoint
entrypoint的最佳用途是設定映象的主命令,允許該映象像該命令一樣執行(然後使用cmd作為預設標誌)。
entrypoint指令也可以與輔助指令碼結合使用,使其能夠以與上述命令類似的方式執行,即使啟動該工具可能需要多個步驟。entrypoint是個命令入口,可以在容器執行的時候傳入引數,
9、volume
volume指令應用於公開由docker容器建立的任何資料庫儲存區域,配置儲存或檔案/資料夾。強烈建議您將volume用於映象的任何可變和/或使用者可維修部分。
10、user
您應該避免安裝或使用sudo,因為它具有不可**的tty和訊號**行為,可能導致比它解決的問題更多的問題。如果你絕對需要類似於sudo的功能(例如,以root身份初始化守護程序但是以非root執行它),你可以使用「gosu」。
11、workdir
指定工作目錄,為了清晰和可靠,您應該始終使用workdir的絕對路徑。此外,你應該使用workdir而不是像run cd那樣激增指令… && do-something,這些指令難以閱讀,故障排除和維護。
12、onbuild
在當前dockerfile構建完成後執行onbuild命令。 onbuild在從當前影象派生的任何子影象中執行。將onbuild命令視為父dockerfile為子dockerfile提供的指令。
Dockerfile 最佳實踐
reference intro guide to dockerfile best practices 本文涉及以下幾方面 在一次發布過程中,映象可能會經過多次重建 rebuild 最後發布 release docker 映象在構建過程中,會保留快取 cache 在重建的過程中可以降低構建時間.所以,...
Dockerfile之最佳實踐
docker 是乙個開源,輕量級的應用容器引擎,基於 golang 語言開發,用於建立 管理和編排容器。與 vmware 虛擬機器相比,docker 使用容器承載應用程式,而不使用作業系統,所以它的開銷很少,效能很高。但是 docker 對應用程式的隔離不如虛擬機器徹底,所以它並不能完全取代 vmw...
Dockerfile 安全最佳實踐
容器安全雖然是乙個很寬泛的問題,但其實有很多小技巧可以幫助我們降低使用的風險。編寫 dockerfile 時遵循一些規則就是乙個很好的出發點。保密字典 secrets 的發布是乙個棘手的問題,很容易出錯。對於容器化的應用,可以通過掛載卷或者環境變數的方式顯示它們。使用env儲存 secrets 則是...