编译规则
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 \
; \
# 克隆并编译指定版本的Go
cd $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" >> ~/.profile
WORKDIR "/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 \
; \
# 克隆并编译指定版本的Go
cd $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" >> ~/.profile
WORKDIR "/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.22
cd /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" >> ~/.profile
WORKDIR "/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.20
wget 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.22
cd /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.20
wget 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.22
cd /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