我理解多阶段构建
多阶段构建就是为了镜像更小更容易维护,易读,最终从一个阶段的核心内容复制到另一个阶段,而不必需要那些非核心的内容。
举例说明
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,因此被跳过。
多阶段构建时用到的参数