雲計算核心技術Docker教程:Docker多階段構建

2020-12-24 TechWeb

多階段構建是一項新功能,需要守護程序和客戶端上使用Docker 17.05或更高版本。多級構建對於在優化Dockerfile的同時使其易於閱讀和維護的任何人都非常有用。

在進行多階段構建之前

關於構建鏡像,最具挑戰性的事情之一是保持鏡像尺寸變小。Dockerfile中的每條指令都會在映像上添加一層,您需要記住在移至下一層之前清除不需要的任何工件。為了編寫一個真正有效的Dockerfile,傳統上,您需要使用Shell技巧和其他邏輯來使各層儘可能小,並確保每一層都具有上一層所需的工件,而沒有其他任何東西。

實際上,通常只有一個Dockerfile用於開發(包含構建應用程式所需的一切),而精簡的Dockerfile用於生產時,僅包含您的應用程式以及運行該應用程式所需的內容。這被稱為「構建器模式」。維護兩個Dockerfile是不理想的。

這是一個Dockerfile.build和Dockerfile的例子,它遵循上面的模式:

Dockerfile.build:

FROM golang:1.7.3

WORKDIR /go/src/github.com/alexellis/href-counter/

COPY app.go .

RUN go get -d -v golang.org/x/net/html \

&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

請注意,此示例還RUN使用Bash&&運算符將兩個命令人工壓縮在一起,以避免在鏡像中創建額外的圖層。這是容易失敗的並且難以維護。

Dockerfile:

FROM alpine:latest

RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY app .

CMD ["./app"]

build.sh:

#!/bin/sh

echo Building alexellis2/href-counter:build

docker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \

-t alexellis2/href-counter:build . -f Dockerfile.build

docker container create --name extract alexellis2/href-counter:build

docker container cp extract:/go/src/github.com/alexellis/href-counter/app ./app

docker container rm -f extract

echo Building alexellis2/href-counter:latest

docker build --no-cache -t alexellis2/href-counter:latest .

rm ./app

運行build.sh腳本時,它需要構建第一個鏡像,從中創建一個容器以複製工件,然後構建第二個鏡像。這兩個映像都佔用了系統空間,並且app 本地磁碟上也仍然有工件。

多階段構建極大地簡化了這種情況!

使用多階段構建

通過多階段構建,您可以FROM在Dockerfile中使用多個語句。每個FROM指令可以使用不同的基礎,並且每個指令都

開始構建的新階段。您可以有選擇地將工件從一個階段複製到另一個階段,從而在最終圖像中留下不需要的所有內

容。為了展示它是如何工作的,讓我們改編上一部分中的Dockerfile以使用多階段構建。

Dockerfile:

FROM golang:1.7.3

WORKDIR /go/src/github.com/alexellis/href-counter/

RUN go get -d -v golang.org/x/net/html

COPY app.go .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest

RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY --from=0 /go/src/github.com/alexellis/href-counter/app .

CMD ["./app"]

您只需要單個Dockerfile。您也不需要單獨的構建腳本。只需運行docker build:

$ docker build -t alexellis2/href-counter:latest .

最終結果是與之前的鏡像大小相同,並大大降低了複雜性。您無需創建任何中間映像,也不需要將任何工件提取到本地系統。

相關焦點

  • 雲計算核心技術Docker教程:Docker容器使用
    docker 客戶端非常簡單 ,我們可以直接輸入 docker 命令來查看到 Docker 客戶端的所有命令選項。可以通過命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
  • 雲計算核心技術Docker教程:Docker Swarm 使用
    進入管理節點,執行:docker info 可以查看當前集群的信息。docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com查看 helloworld 服務運行在哪個節點上,可以看到目前是在 swarm-worker1 節點:
  • 雲計算核心技術Docker教程:Docker容器中開啟SSH服務
    在docker容器中我們不止需要通過宿主機進行登錄對容器進行修改,我還有事還希望直接通過SSH登錄到docker容器中進行一些修改,這樣的話我們需要將容器中ssh埠映射到宿主機,然後再容器中安裝openssh服務。
  • 雲計算核心技術Docker教程: events/inspect命令詳解
    在docker客戶端命令行中我們可以使用events命令從伺服器獲取實時事件便於查找調試問題,使用inspect命令獲取容器或鏡像的元數據。示例docker events : 從伺服器獲取實時事件語法docker events [OPTIONS]OPTIONS說明:-f :根據條件過濾事件;--since :從指定的時間戳後顯示所有事件;--until :流水時間顯示到指定的時間為止;例如,顯示docker 2020
  • 雲計算核心技術Docker教程:events/inspect命令詳解
    在docker客戶端命令行中我們可以使用events命令從伺服器獲取實時事件便於查找調試問題,使用inspect命令獲取容器或鏡像的元數據。示例docker events : 從伺服器獲取實時事件語法docker events [OPTIONS]OPTIONS說明:-f :根據條件過濾事件;
  • 雲計算核心技術Docker教程:Docker 守護進程dockerd默認的CGROUP父級
    如果未設置此選項,則默認為/docker對於fs cgroup驅動程序和system.slicesystemd cgroup驅動程序。如果cgroup的前導斜槓(/),則在根cgroup下創建cgroup,否則在守護程序cgroup下創建cgroup。
  • Docker 入門教程
    7.多租戶環境多租戶環境的應用中, 它可以避免關鍵應用的重寫.我們一個特別的關於這個場景的例子是為loT(物聯網)的應用開發一個快速, 易用的多租戶環境. 這種多租戶的基本代碼非常複雜, 很難處理, 重新規劃以應用不但消耗時間, 也浪費金錢.
  • 不用Docker也能構建容器的4種方法
    使用單獨的 buildkit 構建要單獨使用 buildkit 進行鏡像構建,我們需要在 Linux 主機上單獨運行 buildkit,因此不能使用 Mac。faas-cli build通常會運行或分叉出 docker,因為這個命令實際上只是一個包裝器。
  • 30分鐘帶你了解Web工程師必知的Docker知識
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言筆者之前和朋友一直在討論web技術方向的話題,也一直想了解web運維方面的知識,所以特意請教了一下我的朋友老胡,他對web運維和後端技術有非常多的實戰經驗,所以在本文中他也提供了不少幫助
  • docker下高並發和高可用之docker swarm使用
    ,操作步驟參考Linux下安裝和使用Docker安裝完,使用命令sudo systemctl start docker啟動docker,再通過命令docker version查看docker版本信息利用docker swarm 命令來指定其中一臺虛擬機為docker的Manager管理機docker swarm init --advertise-addr
  • 推薦給IT新手的11個Docker免費上手項目
    5. docker-slim地址: http s:// github.com/docker-slim/docker-slimstar: 8.8k>fork: 306自動縮減 docker 鏡像的體積的工具。
  • 智匯華雲|Docker容器網絡解析
    作為目前最火的輕量級容器技術,Docker有很多令人稱道的功能,如Docker的鏡像管理。然而,Docker的建設也會碰到一系列的挑戰,根據調查報告指出,容器的網絡和安全實現成為容器雲平臺建設最主要的挑戰,當企業開始將重要的企業核心應用遷移至容器平臺,如果缺乏足夠的網絡和安全管控將會給業務上線帶來潛在威脅。
  • 【GITC】搜狐雲臺陳偉:基於docker的自動化運維管理架構與實踐
    在會場,搜狐雲臺的技術負責人陳偉向與會嘉賓介紹了搜狐企業級業務編排運維管理系統——DomeOS。  陳偉進行了題為《基於docker的自動化運維管理架構與實踐》的技術分享,他指出,網際網路公司隨著業務的發展,往往會出現伺服器環境越來越複雜,管理依賴困難等問題。這些問題導致運維壓力大,開發、測試、運維的整體工作效率大打折扣,團隊競爭力下降。行業的問題積累,有時需要新技術的出現才能解決。
  • 利用雲伺服器搭建解鎖免費聽網易雲灰歌曲的代理-docker版
    註:本教程僅作為學習參考使用,請支持正版一、最近在GitHub上發現一個有趣的項目:UnblockNeteaseMusic,可以解鎖網易雲灰色歌曲,利用docker超簡單搭建。二、搭建步驟1、 yum install docker -y ###安裝docker2 、 systemctl start docker ####啟動docker3、systemctl enable docker #########默認開啟
  • Docker命令行入門大全:這18條,你不得不知
    舉個例子,docker container run my_app 是用於構建和運行名為my_app的容器的命令。在本文示例中,我將使用名稱my_container來引用通用容器。同理,my_image、my_tag也是如此。我將單獨提供命令和通用標誌。前面有兩個破折號的標誌是標誌的全名。帶有一個破折號的標誌是完整標誌名稱的縮寫。
  • Kubernetes決定棄用Docker,到底會影響到誰?
    Docker 實現的核心 RunC,也就是 OCI 的典型實現、標準實現。CRI 是個自上而下的標準,源於 Kubernetes 對移植層(運行時)的要求。容器引擎層自下而上定義 OCI,容器編排層自上而下定義 CRI,這也讓它們出現了「套娃「運行情況。
  • Inko 現在已支持在 Docker Hub 使用
    您可以按以下方式安裝這些映像:docker pull inkolang/inko:0.8.1 # When using Dockerpodman pull inkolang/inko:0.8.1 # When using Podman
  • Docker Hub 官方倉庫發布程式語言包
    Docker 容器發展迅速,正在成為構建分布式應用的平臺。而 Docker 項目組的目標就是不斷的提升用戶快速編碼和構建項目的容易程度。而 Docker 的官方倉庫 正是通過用戶反饋以及一些最佳實踐所提供的免費資源庫。
  • Docker實踐者不能錯過Container大會的九大理由
    Container技術已經出現了十幾年,但直到2013年Docker項目的出現,才逐漸火熱起來,廣為人知。如今,Docker擁有 超過500個代碼貢獻者,20個核心Maintainer,超過8000個創建在GitHub上的Docker相關項目,30多個國家90多個城市舉辦的超過250個Docker技術聚會,以及大於 50萬次的boot2docker下載 。
  • 雲計算平臺構建與實踐論壇(二):Docker、CDN成焦點,英特爾,又拍雲...
    【CSDN現場報導】2015年6月3-5日,作為雲計算領域最具影響力的盛會——第七屆中國雲計算大會在國家會議中心盛大開幕。大會以「促進雲計算創新發展,培育信息產業新業態」為主題,承續前六屆的成功經驗,超過100位國內外雲計算領域核心專家精彩演講,聚焦生態系統現狀和發展趨勢,交流實踐經驗,進一步推動技術創新應用。