前言
使用docker build命令或使用Docker Hub的自動構建功能構建Docker鏡像時,都需要一個Dockerfile文件。Dockerfile文件是一個由一系列構建指令組成的文本文件,docker build命令會根據這些構建指令完成Docker鏡像的構建。本文將會介紹Dockerfile文件,及其中使用的構建指令。
1. Dockerfile文件使用
docker build命令會根據Dockerfile文件及上下文構建新Docker鏡像。構建上下文是指Dockerfile所在的本地路徑或一個URL(Git倉庫地址)。構建上下文環境會被遞歸處理,所以,構建所指定的路徑還包括了子目錄,而URL還包括了其中指定的子模塊。
構建鏡像
將當前目錄做為構建上下文時,可以像下面這樣使用docker build命令構建鏡像:
$ docker build .Sending build context to Docker daemon 6.51 MB...
說明:構建會在Docker后臺守護進程(daemon)中執行,而不是CLI中。構建前,構建進程會將全部內容(遞歸)發送到守護進程。大多情況下,應該將一個空目錄作為構建上下文環境,并將Dockerfile文件放在該目錄下。
在構建上下文中使用的Dockerfile文件,是一個構建指令文件。為了提高構建性能,可以通過.dockerignore文件排除上下文目錄下,不需要的文件和目錄。
Dockerfile一般位于構建上下文的根目錄下,也可以通過-f指定該文件的位置:
$ docker build -f /path/to/a/Dockerfile .
構建時,還可以通過-t參數指定構建成后,鏡像的倉庫、標簽等:
鏡像標簽
$ docker build -t shykes/myapp .
如果存在多個倉庫下,或使用多個鏡像標簽,就可以使用多個-t參數:
$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
在Docker守護進程執行Dockerfile中的指令前,首先會對Dockerfile進行語法檢查,有語法錯誤時會返回:
$ docker build -t test/myapp .Sending build context to Docker daemon 2.048 kBError response from daemon: Unknown instruction: RUNCMD
緩存
Docker 守護進程會一條一條的執行Dockerfile中的指令,而且會在每一步提交并生成一個新鏡像,最后會輸出最終鏡像的ID。生成完成后,Docker 守護進程會自動清理你發送的上下文。
Dockerfile文件中的每條指令會被獨立執行,并會創建一個新鏡像,RUN cd /tmp等命令不會對下條指令產生影響。
Docker 會重用已生成的中間鏡像,以加速docker build的構建速度。以下是一個使用了緩存鏡像的執行過程:
$ docker build -t svendowideit/ambassador .Sending build context to Docker daemon 15.36 kBStep 1/4 : FROM alpine:3.2 ---> 31f630c65071Step 2/4 : MAINTAINER SvenDowideit@home.org.au ---> Using cache ---> 2a1c91448f5fStep 3/4 : RUN apk update && apk add socat && rm -r /var/cache/ ---> Using cache ---> 21ed6e7fbb73Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_/([0-9]*/)_TCP=tcp://///(.*/):/(.*/)/socat -t 100000000 TCP4-LISTEN:/1,fork,reuseaddr TCP4:/2:/3 /&/' && echo wait) | sh ---> Using cache ---> 7ea8aef582ccSuccessfully built 7ea8aef582cc
構建緩存僅會使用本地父生成鏈上的鏡像。如果不想使用本地緩存的鏡像,也可以通過--cache-from指定緩存。指定后將再不使用本地生成的鏡像鏈,而是從鏡像倉庫中下載。
新聞熱點
疑難解答