我理解多階段構建
多階段構建就是為了鏡像更小更容易維護,易讀,最終從一個階段的核心內容復制到另一個階段,而不必需要那些非核心的內容。
舉例說明
FROM registry.cn-hangzhou.aliyuncs.com/2qqq/node:14 as build
COPY ./app
WORKDIR /appRUN npm config set registry http://10.6.90.178:8081/repository/groupnpm/
&& npm set canvas_binary_host_ mirror httos://registry.npmmirror.con/-/binary/canvas
&& npm install
&& npm run build:loanFROM registry.cn-hangzhou.aliyuncs.com/zggg/nginx:alpine
Copy --from=build /app/ider /app/www
再來一個例子
FROM golang:1.21
WORKDIR /src
COPY <<EOF ./main.go
package mainimport "fmt"func main() {fmt.Println("hello, world")
}
EOF
RUN go build -o /bin/hello ./main.goFROM scratch
COPY --from=0 /bin/hello /bin/hello
CMD ["/bin/hello"]
最終結果是一個很小的生產圖像,里面除了二進制文件之外什么也沒有。生成的映像中不包含構建應用程序所需的任何構建工具。
以上構建時FROM用到的as是一個別名,和第二個 --from=0都是引用第一個階段的意思
停止在特定的階段
雖然有兩個階段但是你只想構建一個階段
docker build --target build -t hello .
使用其他非dockerfile目錄中的文件來復制,也可以是其他鏡像
COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
buildkit
自版本 23.0 起,BuildKit 是 Docker Desktop 和 Docker Engine 上用戶的默認構建器。
# syntax=docker/dockerfile:1
FROM ubuntu AS base
RUN echo "base"FROM base AS stage1
RUN echo "stage1"FROM base AS stage2
RUN echo "stage2"DOCKER_BUILDKIT=1 docker build --no-cache -f Dockerfile --target stage2 .
這個將只用到base 和 stage2 ,不依賴于stage1,因此被跳過。
多階段構建時用到的參數