dockerfile多阶段构建

我理解多阶段构建

多阶段构建就是为了镜像更小更容易维护,易读,最终从一个阶段的核心内容复制到另一个阶段,而不必需要那些非核心的内容。

举例说明

FROM registry.cn-hangzhou.aliyuncs.com/2qqq/node:14 as build
COPY ./app
WORKDIR /app

RUN 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:loan

FROM 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 main

import "fmt"

func main() {
  fmt.Println("hello, world")
}
EOF
RUN go build -o /bin/hello ./main.go

FROM 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,因此被跳过。
多阶段构建时用到的参数

你可能感兴趣的:(云原生,linux)