編譯規則
1.4之前用C寫的,1.4可編譯后續一直到1.9版本,后續版本實現了自舉,后續版本是go寫的,基本上相互低2個版本能編譯出新版本。
Go <= 1.4:C 工具鏈。
1.5 <= Go <= 1.19:Go 1.4 編譯器。
1.20 <= Go <= 1.21:Go 1.17 編譯器。
1.22 <= Go <= 1.23:Go 1.20 編譯器。
1.4編譯1.13使用alpine鏡像的Dockerfile如下
# Build Golang
FROM alpine:latest as builder# ARG Setting
ARG VERSION=1.13
ARG GOOS=""
ARG GOARCH=""
ARG BOOTSTRAP_VERSION=1.4
ARG BOOTSTRAP_DATE_VERSION=20171003# ENV Setting
LABEL Description="Build Go on alpine" Version="Go version $VERSION"# Building
RUN set -eux; \# Go 1.4編譯的依賴環境安裝apk add --no-cache --virtual .build-deps \bash gcc musl-dev git; \# 下載并解壓Go 1.4的bootstrap版本export GOROOT_BOOTSTRAP=/usr/local/go1.4 \INSTALL=/usr/local \GOROOT=/usr/local/go \; \cd $INSTALL \&& wget https://storage.googleapis.com/golang/go$BOOTSTRAP_VERSION-bootstrap-$BOOTSTRAP_DATE_VERSION.tar.gz \&& tar -xzf go$BOOTSTRAP_VERSION-bootstrap-$BOOTSTRAP_DATE_VERSION.tar.gz \&& mv go go1.4 \&& rm go$BOOTSTRAP_VERSION-bootstrap-$BOOTSTRAP_DATE_VERSION.tar.gz \&& cd go1.4/src \&& ./make.bash \; \# 克隆并編譯指定版本的Gocd $INSTALL \&& git clone https://github.com/golang/go.git \&& cd go/src \&& git checkout release-branch.go$VERSION \&& if [[ "$GOOS" != "" && "$GOARCH" != "" ]]; then \GOOS=$GOOS GOARCH=$GOARCH ./bootstrap.bash; else ./make.bash; fi \# 移除相關依賴&& apk del .build-deps \&& rm -rf $GOROOT_BOOTSTRAP \&& rm -rf $GOROOT/.git \&& $GOROOT/bin/go version# Build a clean Go image
FROM alpine:latest# 復制構建完成的最新版本Go到當前鏡像
COPY --from=builder /usr/local/go /usr/local/go# Go 編譯環境初始化
ENV GOROOT=/usr/local/go \GOPATH=/go
ENV PATH=$GOPATH/bin:$GOROOT/bin:$PATH
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 1777 "$GOPATH"
# 其他初始化相關
RUN echo "alias ll='ls -al'" >> ~/.profile \&& echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> ~/.profileWORKDIR "/go"
1.4編譯1.19的Dockerfile如下
# Build Golang
FROM alpine:latest as builder# ARG Setting
ARG VERSION=1.19
ARG GOOS=""
ARG GOARCH=""
ARG BOOTSTRAP_VERSION=1.4
ARG BOOTSTRAP_DATE_VERSION=20171003# ENV Setting
LABEL Description="Build Go on alpine" Version="Go version $VERSION"# Building
RUN set -eux; \# Go 1.4編譯的依賴環境安裝apk add --no-cache --virtual .build-deps \bash gcc musl-dev git; \# 下載并解壓Go 1.4的bootstrap版本export GOROOT_BOOTSTRAP=/usr/local/go1.4 \INSTALL=/usr/local \GOROOT=/usr/local/go \; \cd $INSTALL \&& wget https://storage.googleapis.com/golang/go$BOOTSTRAP_VERSION-bootstrap-$BOOTSTRAP_DATE_VERSION.tar.gz \&& tar -xzf go$BOOTSTRAP_VERSION-bootstrap-$BOOTSTRAP_DATE_VERSION.tar.gz \&& mv go go1.4 \&& rm go$BOOTSTRAP_VERSION-bootstrap-$BOOTSTRAP_DATE_VERSION.tar.gz \&& cd go1.4/src \&& ./make.bash \; \# 克隆并編譯指定版本的Gocd $INSTALL \&& git clone https://github.com/golang/go.git \&& cd go/src \&& git checkout release-branch.go$VERSION \&& if [[ "$GOOS" != "" && "$GOARCH" != "" ]]; then \GOOS=$GOOS GOARCH=$GOARCH ./bootstrap.bash; else ./make.bash; fi \# 移除相關依賴&& apk del .build-deps \&& rm -rf $GOROOT_BOOTSTRAP \&& rm -rf $GOROOT/.git \&& $GOROOT/bin/go version# Build a clean Go image
FROM alpine:latest# 復制構建完成的最新版本Go到當前鏡像
COPY --from=builder /usr/local/go /usr/local/go# Go 編譯環境初始化
ENV GOROOT=/usr/local/go \GOPATH=/go
ENV PATH=$GOPATH/bin:$GOROOT/bin:$PATH
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 1777 "$GOPATH"
# 其他初始化相關
RUN echo "alias ll='ls -al'" >> ~/.profile \&& echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> ~/.profileWORKDIR "/go"
1.20編譯1.22的Dockerfile如下
# 使用 golang:1.20-alpine 作為基礎鏡像
FROM golang:1.20-alpine as builder# ARG Setting
ARG VERSION=1.22
ARG GOOS=""
ARG GOARCH=""# ENV Setting
LABEL Description="Build Go on alpine" Version="Go version $VERSION"# Building
RUN set -eux; \# 安裝必要的依賴apk add --no-cache --virtual .build-deps \bash gcc musl-dev git; \# 克隆并編譯指定版本的Go到 /usr/local/go1.22cd /usr/local \&& git clone https://github.com/golang/go.git go1.22 \&& cd go1.22/src \&& git checkout release-branch.go$VERSION \&& if [[ "$GOOS" != "" && "$GOARCH" != "" ]]; then \GOOS=$GOOS GOARCH=$GOARCH ./bootstrap.bash; else ./make.bash; fi \# 移除相關依賴&& apk del .build-deps \&& rm -rf /usr/local/go1.22/.git \&& /usr/local/go1.22/bin/go version# Build a clean Go image
FROM alpine:latest# 復制構建完成的最新版本Go到當前鏡像
COPY --from=builder /usr/local/go1.22 /usr/local/go# Go 編譯環境初始化
ENV GOROOT=/usr/local/go \GOPATH=/go
ENV PATH=$GOPATH/bin:$GOROOT/bin:$PATH
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 1777 "$GOPATH"
# 其他初始化相關
RUN echo "alias ll='ls -al'" >> ~/.profile \&& echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> ~/.profileWORKDIR "/go"
1.20編譯1.22的Dockerfile使用alpine為基礎鏡像
# 使用 alpine 作為基礎鏡像
FROM alpine:latest as builder# ARG Setting
ARG VERSION=1.22
ARG GOOS=""
ARG GOARCH=""# ENV Setting
LABEL Description="Build Go on alpine" Version="Go version $VERSION"# 設置阿里云鏡像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories# Building
RUN set -eux; \# 安裝必要的依賴apk add --no-cache --virtual .build-deps \bash gcc musl-dev git wget tar gcompat; \# 下載并安裝 Go 1.20wget https://golang.google.cn/dl/go1.20.14.linux-amd64.tar.gz -O /tmp/go1.20.14.linux-amd64.tar.gz; \tar -C /usr/local -xzf /tmp/go1.20.14.linux-amd64.tar.gz; \rm /tmp/go1.20.14.linux-amd64.tar.gz; \# 設置環境變量export GOROOT=/usr/local/go; \export GOPATH=/go; \export PATH=$GOPATH/bin:$GOROOT/bin:$PATH; \# 創建符號鏈接mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2; \# 克隆并編譯指定版本的Go到 /usr/local/go1.22cd /usr/local \&& wget https://github.com/golang/go/archive/refs/tags/go1.22.0.tar.gz -O /tmp/go1.22.0.tar.gz \&& tar -C /usr/local -xzf /tmp/go1.22.0.tar.gz \&& mv go-go1.22.0 go1.22 \&& rm /tmp/go1.22.0.tar.gz \&& cd go1.22/src \&& if [[ "$GOOS" != "" && "$GOARCH" != "" ]]; then \GOOS=$GOOS GOARCH=$GOARCH ./bootstrap.bash; else ./make.bash; fi \# 移除相關依賴&& apk del .build-deps \&& rm -rf /usr/local/go1.22/.git \&& /usr/local/go1.22/bin/go version# Build a clean Go image
FROM alpine:latest# 設置阿里云鏡像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories# 復制構建完成的最新版本Go到當前鏡像
COPY --from=builder /usr/local/go1.22 /usr/local/go# Go 編譯環境初始化
ENV GOROOT=/usr/local/go \GOPATH=/go
ENV PATH=$GOPATH/bin:$GOROOT/bin:$PATH
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 1777 "$GOPATH"
# 其他初始化相關
RUN echo "alias ll='ls -al'" >> ~/.profile \&& echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> ~/.profile
WORKDIR "/go"
使用alpine注意點,安裝二進制后需要解決musl和glibc的兼容問題,所以額外添加了
apk add gcompat
mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2;
這兩步操作。
1.22支持win7版編譯
# 使用 alpine 作為基礎鏡像
FROM alpine:latest as builder# ARG Setting
ARG VERSION=1.22
ARG GOOS=""
ARG GOARCH=""# ENV Setting
LABEL Description="Build Go on alpine" Version="Go version $VERSION"# 設置阿里云鏡像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories# Building
RUN set -eux; \# 安裝必要的依賴apk add --no-cache --virtual .build-deps \bash gcc musl-dev git wget curl tar gcompat patch; \# 下載并安裝 Go 1.20wget https://golang.google.cn/dl/go1.20.14.linux-amd64.tar.gz -O /tmp/go1.20.14.linux-amd64.tar.gz; \tar -C /usr/local -xzf /tmp/go1.20.14.linux-amd64.tar.gz; \rm /tmp/go1.20.14.linux-amd64.tar.gz; \# 設置環境變量export GOROOT=/usr/local/go; \export GOPATH=/go; \export PATH=$GOPATH/bin:$GOROOT/bin:$PATH; \# 創建符號鏈接mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2; \# 克隆并編譯指定版本的Go到 /usr/local/go1.22cd /usr/local \&& wget https://github.com/golang/go/archive/refs/tags/go1.22.10.tar.gz -O /tmp/go1.22.10.tar.gz \&& tar -C /usr/local -xzf /tmp/go1.22.10.tar.gz \&& mv go-go1.22.10 go1.22 \&& rm /tmp/go1.22.10.tar.gz \# 應用補丁 \# 參考 https://pages.lvtoude.ltd/post/golang-1.21-1.22%E5%85%BC%E5%AE%B9win7/ \# 參考 https://github.com/XTLS/go-win7/blob/build/README-zho-hans.md \# 有兩個補丁無法通過程序自動修補,只能借用提交號 \# 這里借用 https://github.com/golang/go/compare/release-branch.go1.22...XTLS:go-win7:release-branch.go1.22 4個提交號 \&& cd go1.22 \&& curl https://github.com/golang/go/commit/e4701f06a6358bda901e72cbff44f414d902e988.diff | patch --verbose -p 1 \&& curl https://github.com/golang/go/commit/41373f90356fd86e9cbe78c7a71c76066a6730c1.diff | patch --verbose -p 1 \&& curl https://github.com/golang/go/commit/481cebf65c4052379cf3cda5db5588c48f2446f6.diff | patch --verbose -p 1 \&& curl https://github.com/golang/go/commit/21d5caecf644a12d938c45f18e2b55f04b47f0b0.diff | patch --verbose -p 1 \&& cd src \&& if [[ "$GOOS" != "" && "$GOARCH" != "" ]]; then \GOOS=$GOOS GOARCH=$GOARCH ./bootstrap.bash; else ./make.bash; fi \# 移除相關依賴&& apk del .build-deps \&& rm -rf /usr/local/go1.22/.git \&& /usr/local/go1.22/bin/go version# Build a clean Go image
FROM alpine:latest# 設置阿里云鏡像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories# 復制構建完成的最新版本Go到當前鏡像
COPY --from=builder /usr/local/go1.22 /usr/local/go# Go 編譯環境初始化
ENV GOROOT=/usr/local/go \GOPATH=/go
ENV PATH=$GOPATH/bin:$GOROOT/bin:$PATH
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 1777 "$GOPATH"
# 其他初始化相關
RUN echo "alias ll='ls -al'" >> ~/.profile \&& echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> ~/.profile
WORKDIR "/go"
1.22兼容win7參考
https://pages.lvtoude.ltd/post/golang-1.21-1.22%E5%85%BC%E5%AE%B9win7/
https://github.com/XTLS/go-win7/blob/build/README-zho-hans.md