【docker系列】使用Dockerfile構建鏡像
在《【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
1
2
那么ADD比COPY強大在那些地方呢?
ADD支撐從URL下載文件并添加文件到鏡像中,也就是上文中的src可以是URL路徑。
ADD指令,如果源文件是壓縮文件,會自動解壓到鏡像文件中去。
雖然ADD比COPY功能更強大,但是不建議使用。特別在使用壓縮包時它會使構建緩存失效,也會帶來一些令人迷惑的問題。如果確實需要解壓縮壓縮包,使用RUN指令加上shell腳本的解壓命令行進行壓縮包解壓即可。
六、哪些指令會產生鏡像分層
在鏡像構建過程中,需要向鏡像寫入數據的時候會產生分層,一個寫操作命令產生一個分層。 那么哪些指令可能產生“寫入操作”呢?
一定會產生寫入數據操作的是下面的三個指令
FROM
ADD
COPY
有可能產生寫入數據操作的指令是下面三個,是否產生寫操作取決于其腳本執行過程是否有磁盤寫操作
RUN
CMD
ENTRYPOINT
Docker 鏡像服務
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。