编译规则
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