使用源码编译安装golang的docker版

发布于:2025-04-19 ⋅ 阅读:(76) ⋅ 点赞:(0)

编译规则

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


网站公告

今日签到

点亮在社区的每一天
去签到