摘要:在第三種情況下,我建議在另外一個鏡像安裝構(gòu)建工具,基于最小的鏡像。做這個的一個簡單方式是指定包的版本,當(dāng)通過包管理器更新的時候。這里有一個怎樣做的示例我們所能希望的是,但是這是沒有保障的,包倉庫從現(xiàn)在開始的一年仍然會是這個版本。
本文的原文地址是 What constitutes a good docker image?
構(gòu)建一個好的 Docker 鏡像 debian 的基礎(chǔ)鏡像注:本文不會全部翻譯,只會挑選個人認為有價值的部分進行摘取性翻譯,如想詳細閱讀,請看原文
在撰寫本文時,ubuntu:14.04 為 195 MB,然而 debian:wheezy 是 85 MB,但是 Ubuntu 額外的幾百兆字節(jié)不會給你帶來任何價值(我所知道的)。在一些極端情況下,甚至可能你的基礎(chǔ)鏡像是 2 MB busybox。這可能僅僅實際上是二進制包的靜態(tài)連接。
沒有充足的原因,不要安裝構(gòu)建工具構(gòu)建工具占用太多空間,并且從源碼構(gòu)建通常很慢。如果你只是安裝別人的軟件,通常不需要從源碼構(gòu)建,并且它應(yīng)該被避免。比如,沒有必要安裝 python,gcc 等等。為了獲取最新版本的 node.js 并運行在一臺 Debian 主機上。在 node.js downloads page 這里有一個可用的二進制的壓縮包。類似的,redis 可以通過包管理器安裝。
至少有幾個很好的理由使用構(gòu)建工具:
你需要一個指定的版本(比如,在 Debian 倉庫,redis 版本太老)
你需要使用指定的選項編譯
你需要 npm install 安裝一些模塊來編譯進二進制包
在第二種情況下,好好的想清楚,你是否真應(yīng)該這樣做。在第三種情況下,我建議在另外一個 "npm installer" 鏡像安裝構(gòu)建工具,基于最小的 node.js 鏡像。
不要遺留臨時文件下面的 Dockerfile 結(jié)果鏡像大小是 109 MB:
FROM debian:wheezy RUN apt-get update && apt-get install -y wget RUN wget http://cachefly.cachefly.net/10mb.test RUN rm 10mb.test
在另一方面,這看似相當(dāng)?shù)?Dockerfile 結(jié)果鏡像大小是 99 MB:
FROM debian:wheezy RUN apt-get update && apt-get install -y wget RUN wget http://cachefly.cachefly.net/10mb.test && rm 10mb.test
因此看起來如果你在 Dockerfile 的兩個步驟之間在磁盤空間留下了一個文件,當(dāng)你刪除這個文件的時候,空間不會被回收。也可以完全避免臨時文件,僅僅在命令行之間管道輸出。比如:
wget -O - http://nodejs.org/dist/v0.10.32/node-v0.10.32-linux-x64.tar.gz | tar zxf -
將提取壓縮文件,并沒有把它放在文件系統(tǒng)上。
包管理后進行清理如果你運行 apt-get update 設(shè)置你的容器,它在 /var/lib/apt/lists/ 目錄構(gòu)成了數(shù)據(jù),但是一旦鏡像完成,這些數(shù)據(jù)是不需要的。你可以安全的清理那個目錄來節(jié)約一些兆字節(jié)。
這個 Dockerfile 生成一個 99 MB 鏡像:
FROM debian:wheezy RUN apt-get update && apt-get install -y wget
然而這個生成一個 90 MB 的鏡像:
FROM debian:wheezy RUN apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*指定包的版本
當(dāng)一個 Docker 鏡像是不可變的,一個 Dockerfile 是不保證在運行在不同的時間生成相同的輸出。這個問題,當(dāng)然,是外部狀態(tài),并且我們難以控制它。最好在某種程度上最小化你的 Dockerfile 外部狀態(tài)的影響,這是有可能的。做這個的一個簡單方式是指定包的版本,當(dāng)通過包管理器更新的時候。這里有一個怎樣做的示例:
# apt-get update # apt-cache showpkg redis-server Package: redis-server Versions: 2:2.4.14-1 ... # apt-get install redis-server=2:2.4.14-1
我們所能希望的是,但是這是沒有保障的,包倉庫從現(xiàn)在開始的一年仍然會是這個版本。盡管如此,明確的顯示你鏡像中依賴的軟件版本是不可否認的價值。
組合命令如果你有一系列的相關(guān)命令,最好的方式是在一個命令中串聯(lián)它們。這是一個更有意義的構(gòu)建緩存(邏輯分組步驟集中到一個緩存步驟)并使得文件系統(tǒng)層級數(shù)量降下來了(我認為通常這是可取的,但是不知道在客觀上是否是更好的)。
反斜線符號 在這里幫助你提升可讀性:
RUN apt-get update && apt-get install -y wget=1.13.4-3+deb7u1 ca-certificates=20130119 ...使用環(huán)境變量避免重復(fù)
這是我閱讀官方的 node.js Docker 鏡像的 Dockerfile 學(xué)來的一個技巧。此外,這個 Dockerfile 是非常棒的。我唯一的指責(zé)就是它是基于一個巨大的 buildpack-deps 鏡像,帶著各種各樣我不需要或不想要的東西。
你可以使用 ENV 定義環(huán)境變量,然后在一系列的命令中引用它們。下面,我從鏈接的 Dockerfile 中轉(zhuǎn)述了摘要:
ENV NODE_VERSION 0.10.32 RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" && tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 && rm "node-v$NODE_VERSION-linux-x64.tar.gz"
上面這個版本信息,你只需要使用環(huán)境變量 NODE_VERSION 定義一次即可,而不用每次都寫。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/26355.html
摘要:此時,可以構(gòu)建映像,并將其部署為容器。從執(zhí)行以下操作以上命令將使用文件中定義的端口,構(gòu)建對應(yīng)鏡像和部署成為容器。 showImg(https://segmentfault.com/img/remote/1460000010122752); 數(shù)人云之前分享了《如何用Docker實現(xiàn)PHP命令行程序的CI/CD》,詳細地介紹了整體過程中的思路以及以及注意事項,今天帶來的文章將闡述怎樣部署一...
摘要:版本以后,新增了多階段構(gòu)建。所謂多階段構(gòu)建,實際上是允許一個中出現(xiàn)多個指令。因為多個指令會造成多根,則是無法實現(xiàn)的。會使用一個完全干凈的文件系統(tǒng),不包含任何文件。可以使得最后生成的鏡像最小化,其中只包含了程序。 Docker 17.05版本以后,新增了Dockerfile多階段構(gòu)建。所謂多階段構(gòu)建,實際上是允許一個Dockerfile 中出現(xiàn)多個 FROM 指令。這樣做有什么意義呢? ...
摘要:之所以在本地構(gòu)建,而沒有使用倉庫的,是因為,我們的鏡像采用了國內(nèi)阿里云的源,再加上某些很奇妙的網(wǎng)絡(luò)因素,在中自動構(gòu)建時,升級總會失敗。然而,在本地再次構(gòu)建成功。 見字如晤。 前段時間,Node.js 官方發(fā)布了Node 8.9.3 LTS版本,并且官網(wǎng)首頁提示新版本有重要安全更新,Important security releases, please update now! ,然后我立...
摘要:工程師選擇了環(huán)境中的一臺當(dāng)前沒有在負載均衡器中被激活的主機。工程師登陸到這臺主機并從注冊表中獲取新的版本。在生產(chǎn)維護窗口中,更新負載均衡器使其指向更新過的主機。然而將部署代碼化的問題仍然存在。 這篇文章是一系列文章的第一篇,在這一系列文章中,我們想要分享我們?nèi)绾问褂肈ocker、Docker-Compose和Rancher完成容器部署工作流的故事。我們想帶你從頭開始走過pipeline...
閱讀 2637·2023-04-26 02:17
閱讀 1610·2021-11-24 09:39
閱讀 1070·2021-11-18 13:13
閱讀 2598·2021-09-02 15:11
閱讀 2770·2019-08-30 15:48
閱讀 3406·2019-08-30 14:00
閱讀 2431·2019-08-29 13:43
閱讀 658·2019-08-29 13:07