亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 基礎常識 > 正文

在Docker中構建長時間運行的腳本的一些方法

2020-10-21 21:52:20
字體:
來源:轉載
供稿:網友

我想我已經找到了一個非常不錯的Docker使用案例。你是不是會覺得這是一篇寫Docker有多好多好的文章,開始之前我想和你確認,這篇文章會介紹如何把文件系統作為持久性的數據結構。

因此,這篇文章的見解同樣適用于其他的 copy-on-write文件系統,如BTRFS和ZFS。
問題

讓我們從這個我試圖解決的問題開始。我開發了一個會運行很長時間的構建腳本,這個腳本中包含了很多的步驟。

    這個腳本會運行1-2個小時。
    它會從網絡下載比較大的文件(超過300M)。
    后面的構建步驟依賴前期構建的庫。

但最最煩人的是,運行這個腳本真的需要花很長的時間。
文件系統是固有狀態

我們一般是通過一種有狀態的方式與文件系統進行交互的。我們可以添加、刪除或移動文件。我們可以修改文件的 權限或者它的訪問時間。大部分獨立的操作都可以撤銷,例如將文件移動到其它地方后,你可以將文件恢復到原來的位置。但我們不會通過快照的方式來將它恢復到 原始狀態。這篇文章我將會介紹如何在耗時較長的腳本中充分利用快照這一特性。
使用聯合文件系統的快照

Docker使用的是聯合文件系統叫做AUFS(譯者注:簡單來說就是支持將不同目錄掛載到同一個虛擬文件系統下的文件系統)。聯合文件系統實現了Union mount。顧名思義,也就是說不同的文件系統的文件和目錄可以分層疊加在單個連貫文件系統之上。這是通過分層的方式完成的。如果一個文件出現在兩個文件系統,那最高層級的文件才會顯示(該文件其它版本也是存在于層級中的,不會改變,只是看不到的)。

在Docker中,每一個在Union mount轉哦給你的文件系統都被稱為layers(層)。使用這種技術可以輕松實現快照,每個快照都是所有層的一個Union mount。
生成腳本的快照

使用快照可以幫助構建一個長時運行的腳本??偟南敕ㄊ牵瑢⒁粋€大的腳本分解為許多小的腳本(我喜歡稱之為 scriptlets),并單獨運行這些小的腳本,腳本運行后為其文件系統打一個快照 (Docker會自動執行此操作)。如果你發現一個scriptlet運行失敗,你可以快速回退到上次的快照,然后再試一次。一旦你完成腳本的構建,并且 可以保證腳本能正常工作,那你就可以將它分配給其它主機。

回過頭來再對比下,如果你沒有使用快照功能了?當你辛辛苦苦等待了一個半小時后,腳本卻構建失敗了,我想除了少部分有耐心的人外,很多人是不想再來一次了,當然,你也會盡最大努力把系統恢復到失敗前的狀態,比如可以刪除一個目錄或運行make clean。

但是,我們可能沒有真正地理解我們正在構建的組件。它可能有復雜的Makefile,它會把把文件放到文件系統中我們不知道的地方,唯一真正確定的途徑是恢復到快照。
使用快照構建腳本的Docker

在本節中,我將介紹我是如何使用Docker實現GHC7.8.3 ARM交叉編譯器的構建腳本。Docker非常適合做這件事,但并非完美。我做了很多看起來沒用的或者不雅的事情,但都是必要的,這都是為了保證將開發腳本的總時間降到最低限度。構建腳本可以在這里找到。
用Dockerfile構建

Docker通過讀取Dockerfile來構建鏡像。Dockerfile會通過一些命令來具體指定應該執行哪些動作。在我的腳本中主要用到WORKDIR、ADD和RUN。ADD命令非常有用因為它可以讓你在運行之前將外部文件添加到當前Docker鏡像中然后轉換成鏡像的文件系統。你可以在這里看到很多scriptlets構成的構建腳本。
設計

1. 在RUN之前ADD scriptlets

如果你很早就將所有的scriptletsADD在Dockerfile,您可能會遇到以下問題:如果你的腳本構建失敗,你回去修改scriptlet并再次運行docker build。但是你發現,Docker開始在首次加入scriptlets的地方構建!這樣做會浪費了大量的時間并且違背了使用快照的目的。

出現這種情況的原因是由于Docker處理它的中間鏡像(快照)的方式。當Docker通過Dockerfile構建鏡像時,它會與中間鏡像比較當前命令是否一致。然而,在ADD命令的情況下被裝進鏡像的文件里的內容也會被檢查。如果相對于現有的中間鏡像,文件已經改變,那么Docker也別無選擇,只能從這點開始建立一個新的鏡像。因為Docker不知道這些變化會不會影響到構建。

此外,使用RUN命令要注意,每次運行時它都會導致文件系統有不同的更改。在這種情況下,Docker會發現中間鏡像并使用它,但是這將是錯誤的。RUN命令每次運行時會造成文件系統相同的改變。舉個例子,我確保在我的scriptlets我總是下載了一個已知版本的文件與一個特定MD5校驗。

對Docker 構建緩存更詳細的解釋可以在這里找到。

2.不要使用ENV命令來設置環境變量,請使用scriptlet。

它似乎看起來很有誘惑力:使用ENV命令來設置所有構建腳本需要的環境變量。但是,它不支持變量替換的方式,例如 ENV BASE=$HOME/base 將設置BASE的值為$HOME/base著很可能不是你想要的。

相反,我用ADD命令添加一個名為set-env.sh文件。此文件會包含在后續的scriptlet中:

   

復制代碼
代碼如下:
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $THIS_DIR/set-env-1.sh

如果你沒有在第一時間獲取set-env.sh會怎么樣呢?它很早就被加入Dockerfile并不意味著修改它將會使隨后的快照無效?

是的,這會有問題。在開發腳本時,我發現,我已經錯過了在set-env.sh添加一個有用的環境變量。解決方案是創建一個新的文件set-env-1.sh包含:

   

復制代碼
代碼如下:
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $THIS_DIR/set-env.sh
if ! [ -e "$CONFIG_SUB_SRC/config.sub" ] ; then
CONFIG_SUB_SRC=${CONFIG_SUB_SRC:-$NCURSES_SRC}
fi

然后,在所有后續的scriptlets文件中包含了此文件?,F在,我已經完成了構建腳本,我可以回去解決這個問題了,但是,在某種意義上,它會破壞最初的目標。我將不得不從頭開始運行構建腳本看看這種變化是否能成功。
缺點

一個主要缺點是這種方法是,所構建的鏡像尺寸是大于它實際需求的尺寸。在我的情況下尤其如此,因為我在最后刪除了大量文件的。然而,這些文件都仍然存在于聯合掛載文件系統的底層文件系統內,所以整個鏡像是大于它實際需要的大小至少多余的是刪除文件的大小。

然而,有一個變通。我沒有公布此鏡像到Docker Hub Registry。相反,我:

    使用docker export導出內容為tar文件。
    創建一個新的Dockerfile簡單地添加了這個tar文件的內容。

產生尺寸盡可能小的鏡像。
結論

這種方法的優點是雙重的:

    它使開發時間降至最低,不再做那些已經構建成功的子組件。你可以專注于那些失敗的組件。
    這非常便于維護構建腳本。構建可能會失敗,但只要你搞定Dockerfiel,至少你不必再從頭開始。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美人与性动交a欧美精品| 国产精品高清免费在线观看| 色哟哟入口国产精品| 欧美成人午夜剧场免费观看| 亚洲国模精品私拍| 欧美日韩在线观看视频小说| 国产精品一区二区电影| 成人黄色av网| 欧美插天视频在线播放| 国产日韩欧美中文| 精品人伦一区二区三区蜜桃免费| 久久国产精品首页| 亚洲成人亚洲激情| 69视频在线播放| 成人国内精品久久久久一区| 自拍偷拍亚洲精品| 久久久久久综合网天天| 91最新国产视频| 国产ts一区二区| 在线成人激情黄色| 亚洲а∨天堂久久精品9966| 日韩av中文字幕在线| 68精品国产免费久久久久久婷婷| 日韩二区三区在线| 欧洲永久精品大片ww免费漫画| 中文字幕亚洲色图| 97久久伊人激情网| 欧美成人精品在线播放| 精品视频在线观看日韩| 91在线免费视频| 日韩中文在线视频| 91免费国产网站| 97超碰蝌蚪网人人做人人爽| 国产精品日韩欧美大师| 91亚洲人电影| 96精品久久久久中文字幕| 久久久人成影片一区二区三区观看| 国产午夜精品一区理论片飘花| 亚洲精品视频久久| 成人性教育视频在线观看| 日本精品久久久久影院| 亚洲国产99精品国自产| 亚洲精品wwwww| 国产午夜精品视频免费不卡69堂| 日韩中文第一页| 国产精品无码专区在线观看| 国产一区二区三区精品久久久| 少妇av一区二区三区| 九九综合九九综合| 最近日韩中文字幕中文| 91国偷自产一区二区三区的观看方式| 日韩在线视频网站| 欧美日韩一区二区在线| 国产99在线|中文| 国产精品免费一区二区三区都可以| 欧美国产精品va在线观看| 国产精品老女人视频| 亚洲精品中文字幕av| 中文一区二区视频| 日韩极品精品视频免费观看| 国产视频精品免费播放| 成人午夜一级二级三级| 国产一区二区在线免费| 亚洲成色777777在线观看影院| 欧美激情精品久久久久久免费印度| 欧美电影在线观看完整版| 91精品国产自产在线老师啪| 国内成人精品一区| 精品久久久久久久久久久久| 久久久久久午夜| 精品毛片网大全| 欧美成人亚洲成人| 亚洲精品久久久久| 亚洲国产精品久久91精品| 国产成人精品在线播放| 日韩电影中文 亚洲精品乱码| 欧美国产日韩视频| 一本一道久久a久久精品逆3p| 亚洲裸体xxxx| 亚洲欧美日韩视频一区| 欧美精品性视频| 精品国产成人在线| 成人国产精品色哟哟| 国产成人久久久| 欧美亚洲午夜视频在线观看| 57pao国产精品一区| 国产成人在线视频| 日韩精品在线免费观看视频| 成人午夜激情网| 欧美激情区在线播放| 欧美大片在线看免费观看| 日韩中文理论片| 欧美在线视频播放| 欧美最近摘花xxxx摘花| 日韩av片永久免费网站| 成人在线观看视频网站| 日韩在线播放av| 亚洲三级黄色在线观看| 中文欧美在线视频| 在线电影av不卡网址| 亚洲精品一区av在线播放| 久久不射热爱视频精品| 精品国产乱码久久久久久虫虫漫画| 日韩一区二区av| 在线视频一区二区| 亚洲免费视频观看| 97视频免费在线看| 欧美肥老太性生活视频| 俺去亚洲欧洲欧美日韩| 欧美精品激情blacked18| 国产69久久精品成人看| 久久久久久久久久久免费精品| 日韩国产精品一区| 亚洲国产婷婷香蕉久久久久久| 欧洲亚洲在线视频| 91久久久在线| 日韩精品一区二区三区第95| 国产精品视频免费在线| 色阁综合伊人av| 91免费的视频在线播放| 国产精品视频区1| 日韩免费精品视频| 国产一区二区香蕉| 97免费视频在线播放| 亚洲美女精品成人在线视频| 日韩在线播放一区| 国产成人综合av| 亚洲精品一区二区三区婷婷月| 亚洲综合一区二区不卡| 欧美日韩国产中文精品字幕自在自线| 欧美成人免费播放| 国产成人精品在线观看| 国产成人精品免高潮费视频| 91精品91久久久久久| 亚洲欧洲自拍偷拍| 亚洲色图第三页| 欧美电影在线观看网站| 亚洲bt欧美bt日本bt| 色无极亚洲影院| 中文字幕亚洲专区| 川上优av一区二区线观看| 中日韩美女免费视频网站在线观看| 7m第一福利500精品视频| 91精品国产色综合久久不卡98| 国产精品女视频| 欧美亚州一区二区三区| 国产日韩欧美夫妻视频在线观看| 国产欧美久久一区二区| 538国产精品一区二区免费视频| 欧美亚洲另类制服自拍| 亚洲美女精品成人在线视频| 欧美激情成人在线视频| 久久精品91久久久久久再现| 亚洲成人a**站| 亚洲国产精品国自产拍av秋霞| 黑人巨大精品欧美一区二区一视频| 日韩精品福利在线| 欧美成人精品三级在线观看| 日韩av日韩在线观看| 日韩精品高清在线观看| 成人网欧美在线视频| 日日摸夜夜添一区| 欧美亚洲成人网| 国产精品aaaa|