成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

怎樣構(gòu)建一個(gè)好的 Docker 鏡像

kk_miles / 2911人閱讀

摘要:在第三種情況下,我建議在另外一個(gè)鏡像安裝構(gòu)建工具,基于最小的鏡像。做這個(gè)的一個(gè)簡(jiǎn)單方式是指定包的版本,當(dāng)通過包管理器更新的時(shí)候。這里有一個(gè)怎樣做的示例我們所能希望的是,但是這是沒有保障的,包倉(cāng)庫(kù)從現(xiàn)在開始的一年仍然會(huì)是這個(gè)版本。

  

本文的原文地址是 What constitutes a good docker image?

  

注:本文不會(huì)全部翻譯,只會(huì)挑選個(gè)人認(rèn)為有價(jià)值的部分進(jìn)行摘取性翻譯,如想詳細(xì)閱讀,請(qǐng)看原文

構(gòu)建一個(gè)好的 Docker 鏡像 debian 的基礎(chǔ)鏡像

在撰寫本文時(shí),ubuntu:14.04 為 195 MB,然而 debian:wheezy 是 85 MB,但是 Ubuntu 額外的幾百兆字節(jié)不會(huì)給你帶來任何價(jià)值(我所知道的)。在一些極端情況下,甚至可能你的基礎(chǔ)鏡像是 2 MB busybox。這可能僅僅實(shí)際上是二進(jìn)制包的靜態(tài)連接。

沒有充足的原因,不要安裝構(gòu)建工具

構(gòu)建工具占用太多空間,并且從源碼構(gòu)建通常很慢。如果你只是安裝別人的軟件,通常不需要從源碼構(gòu)建,并且它應(yīng)該被避免。比如,沒有必要安裝 python,gcc 等等。為了獲取最新版本的 node.js 并運(yùn)行在一臺(tái) Debian 主機(jī)上。在 node.js downloads page 這里有一個(gè)可用的二進(jìn)制的壓縮包。類似的,redis 可以通過包管理器安裝。

至少有幾個(gè)很好的理由使用構(gòu)建工具:

你需要一個(gè)指定的版本(比如,在 Debian 倉(cāng)庫(kù),redis 版本太老)

你需要使用指定的選項(xiàng)編譯

你需要 npm install 安裝一些模塊來編譯進(jìn)二進(jìn)制包

在第二種情況下,好好的想清楚,你是否真應(yīng)該這樣做。在第三種情況下,我建議在另外一個(gè) "npm installer" 鏡像安裝構(gòu)建工具,基于最小的 node.js 鏡像。

不要遺留臨時(shí)文件

下面的 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 的兩個(gè)步驟之間在磁盤空間留下了一個(gè)文件,當(dāng)你刪除這個(gè)文件的時(shí)候,空間不會(huì)被回收。也可以完全避免臨時(shí)文件,僅僅在命令行之間管道輸出。比如:

wget -O - http://nodejs.org/dist/v0.10.32/node-v0.10.32-linux-x64.tar.gz | tar zxf -

將提取壓縮文件,并沒有把它放在文件系統(tǒng)上。

包管理后進(jìn)行清理

如果你運(yùn)行 apt-get update 設(shè)置你的容器,它在 /var/lib/apt/lists/ 目錄構(gòu)成了數(shù)據(jù),但是一旦鏡像完成,這些數(shù)據(jù)是不需要的。你可以安全的清理那個(gè)目錄來節(jié)約一些兆字節(jié)。

這個(gè) Dockerfile 生成一個(gè) 99 MB 鏡像:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget

然而這個(gè)生成一個(gè) 90 MB 的鏡像:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*
指定包的版本

當(dāng)一個(gè) Docker 鏡像是不可變的,一個(gè) Dockerfile 是不保證在運(yùn)行在不同的時(shí)間生成相同的輸出。這個(gè)問題,當(dāng)然,是外部狀態(tài),并且我們難以控制它。最好在某種程度上最小化你的 Dockerfile 外部狀態(tài)的影響,這是有可能的。做這個(gè)的一個(gè)簡(jiǎn)單方式是指定包的版本,當(dāng)通過包管理器更新的時(shí)候。這里有一個(gè)怎樣做的示例:

# 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

我們所能希望的是,但是這是沒有保障的,包倉(cāng)庫(kù)從現(xiàn)在開始的一年仍然會(huì)是這個(gè)版本。盡管如此,明確的顯示你鏡像中依賴的軟件版本是不可否認(rèn)的價(jià)值。

組合命令

如果你有一系列的相關(guān)命令,最好的方式是在一個(gè)命令中串聯(lián)它們。這是一個(gè)更有意義的構(gòu)建緩存(邏輯分組步驟集中到一個(gè)緩存步驟)并使得文件系統(tǒng)層級(jí)數(shù)量降下來了(我認(rèn)為通常這是可取的,但是不知道在客觀上是否是更好的)。

反斜線符號(hào) 在這里幫助你提升可讀性:

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é)來的一個(gè)技巧。此外,這個(gè) Dockerfile 是非常棒的。我唯一的指責(zé)就是它是基于一個(gè)巨大的 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"

上面這個(gè)版本信息,你只需要使用環(huán)境變量 NODE_VERSION 定義一次即可,而不用每次都寫。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26355.html

相關(guān)文章

  • 輕松搞定|將PHP和Couchbase應(yīng)用部署為Docker

    摘要:此時(shí),可以構(gòu)建映像,并將其部署為容器。從執(zhí)行以下操作以上命令將使用文件中定義的端口,構(gòu)建對(duì)應(yīng)鏡像和部署成為容器。 showImg(https://segmentfault.com/img/remote/1460000010122752); 數(shù)人云之前分享了《如何用Docker實(shí)現(xiàn)PHP命令行程序的CI/CD》,詳細(xì)地介紹了整體過程中的思路以及以及注意事項(xiàng),今天帶來的文章將闡述怎樣部署一...

    X1nFLY 評(píng)論0 收藏0
  • Dockerfile多階段構(gòu)建原理和使用場(chǎng)景

    摘要:版本以后,新增了多階段構(gòu)建。所謂多階段構(gòu)建,實(shí)際上是允許一個(gè)中出現(xiàn)多個(gè)指令。因?yàn)槎鄠€(gè)指令會(huì)造成多根,則是無法實(shí)現(xiàn)的。會(huì)使用一個(gè)完全干凈的文件系統(tǒng),不包含任何文件??梢允沟米詈笊傻溺R像最小化,其中只包含了程序。 Docker 17.05版本以后,新增了Dockerfile多階段構(gòu)建。所謂多階段構(gòu)建,實(shí)際上是允許一個(gè)Dockerfile 中出現(xiàn)多個(gè) FROM 指令。這樣做有什么意義呢? ...

    fireflow 評(píng)論0 收藏0
  • 記一次Docker構(gòu)建失敗

    摘要:之所以在本地構(gòu)建,而沒有使用倉(cāng)庫(kù)的,是因?yàn)?,我們的鏡像采用了國(guó)內(nèi)阿里云的源,再加上某些很奇妙的網(wǎng)絡(luò)因素,在中自動(dòng)構(gòu)建時(shí),升級(jí)總會(huì)失敗。然而,在本地再次構(gòu)建成功。 見字如晤。 前段時(shí)間,Node.js 官方發(fā)布了Node 8.9.3 LTS版本,并且官網(wǎng)首頁(yè)提示新版本有重要安全更新,Important security releases, please update now! ,然后我立...

    joyqi 評(píng)論0 收藏0
  • 學(xué)習(xí)使用Docker、Docker-Compose和Rancher搭建部署Pipeline(一)

    摘要:工程師選擇了環(huán)境中的一臺(tái)當(dāng)前沒有在負(fù)載均衡器中被激活的主機(jī)。工程師登陸到這臺(tái)主機(jī)并從注冊(cè)表中獲取新的版本。在生產(chǎn)維護(hù)窗口中,更新負(fù)載均衡器使其指向更新過的主機(jī)。然而將部署代碼化的問題仍然存在。 這篇文章是一系列文章的第一篇,在這一系列文章中,我們想要分享我們?nèi)绾问褂肈ocker、Docker-Compose和Rancher完成容器部署工作流的故事。我們想帶你從頭開始走過pipeline...

    mikyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<