docker系列使用Dockerfile構建鏡像

      網友投稿 857 2022-05-29

      在《【docker系列】逐行解析Nginx鏡像Dockerfile(學習經典)》文章中我們已經將Dokcerfile的核心指令做了詳盡的說明解釋,本文我們就學習使用Dockerfile構建鏡像,以及對Dockerfile的使用做一些補充說明。

      文章目錄

      一、使用Dockerfile構建鏡像

      二、` .dockerignore` 文件

      三、用戶切換USER

      四、VOLUME指令(不建議使用)

      五、ADD與COPY的區別(不建議使用ADD)

      六、哪些指令會產生鏡像分層

      一、使用Dockerfile構建鏡像

      使用docker build指令構建鏡像如下所示:

      docker build -t <鏡像名稱>:<標簽或版本號> /path/to/a/Dockerfile

      1

      -t? 給鏡像指定名稱并且添加一個標簽或版本號

      /path/to/a/Dockerfile Dockerfile所在的路徑

      我們寫一個最簡單的Dockerfile用來做實驗

      from ubuntu CMD echo "hello world from zimug"

      1

      2

      把Dockerfile放入一個目錄,并在該目錄下執行下面的構建命令。命令行最后的一個點表示當前路徑。

      docker build -t helloworld:1.0 .

      1

      構建過程分為2步,因為我們只寫了2個指令。

      通過docker images查看構建完成的鏡像

      # docker images REPOSITORY TAG IMAGE ID CREATED SIZE helloworld 1.0 a4c0e3f907ee 2 minutes ago 72.8MB

      1

      2

      3

      運行docker run從鏡像啟動一個容器,可以看到echo命令生效,終端顯示“hello world from zimug”

      二、 .dockerignore 文件

      細心的讀者可能會看到,上文中在執行構建命令docker build的時候出現了下面的這一行日志。這是因為在執行鏡像構建的時候,會將Dockerfile所在路徑的文件發給Docker daemon,也就是說這個目錄下的所有文件全部提交給Docker daemon,如果這個路徑下文件比較多就會很耗時。

      Sending build context to Docker daemon 1.864GB

      1

      當然我們在構建鏡像的時候,盡量保證Dockerfile所在路徑不存在鏡像構建無關的文件。除此之外,還有一種方式就是寫一個.dockerignore文件,將與構建鏡像無關的文件全都寫道這個文件里面。如:

      *.log *.md data logs

      1

      2

      3

      4

      這樣在執行構建命令的時候,無關的文件就不會被發往Docker daemon,構建過程也更加快速。

      Sending build context to Docker daemon 83.95MB

      1

      三、用戶切換USER

      對于絕大多數軟件,使用ROOT用戶啟動是不夠安全的,甚至有些軟件服務根本就不允許使用root用戶啟動。所以我們需要一個在容器內切換用戶的指令,他就是USER。比如:

      RUN groupadd -r redis && useradd -r -g redis redis USER redis

      1

      2

      需要說明的是USER只能切換用戶,前提是該用戶已經存在。如果不存在,我們可以像上文一樣先用RUN指令+shell命令去創建。

      四、VOLUME指令(不建議使用)

      Dockerfile還有另外一個指令,我沒有為大家介紹過,從我個人的經驗來看不建議使用它。

      VOLUME ["/data1","/data2"]

      1

      比如上面的VOLUME會在容器啟動時,將容器內的"/data1","/data2"路徑映射到宿主機本地目錄,映射關系可能是

      當我們容器被銷毀后這個路徑仍然存在,會造成垃圾數據。如果確實需要Volume數據卷可以使用docker run -v顯示指定,或者使用后面文章中會為大家介紹的docker volume來命名創建數據卷。

      五、ADD與COPY的區別(不建議使用ADD)

      在我之前的文章中已經介紹COPY指令的作用是將執行鏡像構建的本地文件或目錄src拷貝到宿主機的文件目錄dest中去。還有一個和COPY指令非常相似的指令就是ADD指令,語法和COPY幾乎一致,但是功能比COPY更加強大。

      COPY ADD

      1

      2

      那么ADD比COPY強大在那些地方呢?

      ADD支撐從URL下載文件并添加文件到鏡像中,也就是上文中的src可以是URL路徑。

      ADD指令,如果源文件是壓縮文件,會自動解壓到鏡像文件中去。

      雖然ADD比COPY功能更強大,但是不建議使用。特別在使用壓縮包時它會使構建緩存失效,也會帶來一些令人迷惑的問題。如果確實需要解壓縮壓縮包,使用RUN指令加上shell腳本的解壓命令行進行壓縮包解壓即可。

      六、哪些指令會產生鏡像分層

      在鏡像構建過程中,需要向鏡像寫入數據的時候會產生分層,一個寫操作命令產生一個分層。 那么哪些指令可能產生“寫入操作”呢?

      一定會產生寫入數據操作的是下面的三個指令

      FROM

      ADD

      COPY

      有可能產生寫入數據操作的指令是下面三個,是否產生寫操作取決于其腳本執行過程是否有磁盤寫操作

      RUN

      CMD

      ENTRYPOINT

      【docker系列】使用Dockerfile構建鏡像

      Docker 鏡像服務

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:二分實現及工程使用—Kafka
      下一篇:實驗樓ROS機器人操作系統自主學習云端平臺已經發布
      相關文章
      亚洲午夜未满十八勿入网站2| 内射少妇36P亚洲区| 亚洲av无码乱码国产精品fc2| 亚洲国产综合无码一区二区二三区| 亚洲熟女精品中文字幕| 亚洲AV综合色区无码一区| 国产黄色一级毛片亚洲黄片大全| 国产产在线精品亚洲AAVV| 亚洲第一se情网站| 亚洲av日韩精品久久久久久a| 亚洲人成黄网在线观看| 亚洲日韩国产精品无码av| 亚洲精品动漫在线| 亚洲精品在线免费观看| 亚洲综合无码一区二区三区| 久久亚洲AV成人无码| 亚洲美女精品视频| 亚洲成人福利在线| 亚洲av乱码一区二区三区| 中文字幕在线观看亚洲视频| 亚洲熟妇AV一区二区三区浪潮| 中文字幕乱码亚洲无线三区 | 亚洲日韩精品射精日| 亚洲中久无码永久在线观看同| 国产亚洲AV手机在线观看| 亚洲人成网7777777国产| 亚洲国产精品乱码一区二区 | 亚洲成人激情小说| 亚洲精品无码专区在线| 亚洲AV女人18毛片水真多| 五月婷婷亚洲综合| 亚洲片一区二区三区| 亚洲中文字幕久久精品无码喷水 | 国产午夜亚洲精品理论片不卡| 国产亚洲精品无码成人| 亚洲国产二区三区久久| 亚洲精品日韩中文字幕久久久| 激情综合亚洲色婷婷五月| 亚洲第一成年网站视频| 亚洲国产精品碰碰| 国产亚洲成AV人片在线观黄桃|