Go

Go - 多阶段构建docker镜像

2023-04-24  本文已影响0人  红薯爱帅

1. 概述

对于Golang程序而言,源码需要编译,且在编译过程中还会下载一些依赖的packages,最终生成一个可执行的binary文件。如果使用docker部署,只需要将binary文件放到docker image里面即可,不需要golang源码和依赖的packages。

因此,容易想到的方法:

这种方法比较麻烦,只拷贝一个binary文件,还好。如果来回copy多个文件或文件夹,就不make sense了,例如

上面两个scenario还有一个共性,源码不能出现在最终的docker image的layer中,否则就失去了初心。

这个时候,Multi-stage builds就非常有必要了。

2. 多阶段构建Multi-stage builds

看一个来自docker官方文档的例子:

FROM golang:1.16 AS builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go ./
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app ./
CMD ["./app"]  

语法还是比较简单的,基本一看就懂,只需要注意两个点:

3. 其他用法

关于多阶段构建镜像,docker官方还提供了一些其他玩法,可以根据需要灵活选择。

3.1. 只构建特定stage的docker image

通过--target指明stage name,build该stage后将停止构建。

A few scenarios where this might be very powerful are:

docker build --target builder -t alexellis2/href-counter:latest .

3.2. 引用已定义的stage作为from源

# syntax=docker/dockerfile:1

FROM alpine:latest AS builder
RUN apk --no-cache add build-base

FROM builder AS build1
COPY source1.cpp source.cpp
RUN g++ -o /binary source.cpp

FROM builder AS build2
COPY source2.cpp source.cpp
RUN g++ -o /binary source.cpp

4. 参考

Multi-stage builds | Docker Documentation

上一篇下一篇

猜你喜欢

热点阅读