今天來討論昨天docker build過程docker server如何運作
依照dockerfile的順序,不假思索會以為docker build就是下載base image,然後把container跑起來,安裝redis後,再執行CMD,全部過程在同一個container下執行,然而並非如此。
事實上是每一個statement都會依照上一個statement產生的image跑一個temporary container,statement產生新的image並把temporary container移除,除了FROM statement。
Step 1 因為local沒有alpine image,所以到Docker Hub下載image,id為196d12cf6ab1
Step 2 以196d12cf6ab1跑一個temporary container,container id為9054ef5db46a,執行apk add --update redis,完成後移除temporary container(Removing intermediate container 9054ef5db46a),產生新的image 412c53a5addb
Step 3 以412c53a5addb跑一個temporary container,container id為174c749daf92,執行apk add --update redis,完成後移除temporary container(Removing intermediate container 174c749daf92),產生新的image 00637dd534bf
因為沒有下一個statement,build process完成。
我們可以新增安裝python來看,是否每一個statement都會產生臨時container
# 選擇kernel/OS
FROM alpine
# 安裝redis
RUN apk add --update redis
# 增加安裝python
RUN apk add --update python
# 指定啟動container後執行命令
CMD ["redis-server"]
上次產生過的image會用local的cache,安裝python會產生臨時的container(6bd6d64a4d89),但最後的CMD statement並沒有用cache是它看到image是安裝python的image而不是前一次安裝redis的image。