php 多阶段构建,dockerfile多阶段构建例子

#编译环境,生成二进制文件

FROM golang:1.14.2-alpine3.11 as builder

MAINTAINER xtaci

ENV GO111MODULE=on

RUN apk update && \

apk upgrade && \

apk add git gcc libc-dev linux-headers

RUN go get -ldflags "-X main.VERSION=$(date -u +%Y%m%d) -s -w" github.com/xtaci/kcptun/client && go get -ldflags "-X main.VERSION=$(date -u +%Y%m%d) -s -w" github.com/xtaci/kcptun/server

#只拷贝所需要的二进制文件

FROM alpine:3.11

RUN apk add --no-cache iptables

COPY --from=builder /go/bin /bin

EXPOSE 29900/udp

EXPOSE 12948

这个例子,是以golang 1.14 进行打包的,其实主要命令就是go get 会生成文件到GOPATH="/home/chunk/go",比如以上dockerfile的go get会生成两个文件到GOPATH的bin

ls /home/chunk/go/bin/

client server

多阶段构建的目的只要就是缩小docker容器的体积,最终打出来的镜像以FROM alpine:3.11为准,关键在于

COPY --from=builder /go/bin /bin, 只拷贝了/go/bin 整个目录到/bin,即系client和server这个两个二进制文件,从而避免把git gcc libc-dev linux-headers这些包也打入镜像,从而达到最小镜像。

如何运行这个镜像

docker run -d -p 1505:1505 -p 29900:29900 xtaci/kcptun client -r xxx.xxx.xxx.xxx:29900 -l :1505 -key test -mtu 1400 -mode fast3

有疑问加站长微信联系(非本文作者)

你可能感兴趣的:(php,多阶段构建)