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

编译规则

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android平台 Hal AIDL 系列文章目录

目录 1. Android Hal AIDL 简介2. AIDL 语言简介3. Android 接口定义语言 (AIDL)4. 定义AIDL 接口5. AIDL 中如何传递 Parcelable 对象6. 如何使用AIDL 定义的远程接口进行跨进程通信7. 适用于 HAL 的 AIDL8. Android Hal AIDL 编译调试9. 高版本Android (AIDL HAL) 沿用HIDL方…

【失败】Gnome将默认终端设置为 Kitty

起因 一会儿gnome-terminal一会儿kitty终端&#xff0c;实在是受不了&#xff0c;决定取缔默认的gnome-terminal。 过程 在 Ubuntu 或 Debian 系统上&#xff1a; 确保 Kitty 已经安装。如果未安装&#xff0c;可以在终端中运行命令sudo apt install kitty -y进行安装。 使用系…

Linux工具学习之【gcc/g++】

&#x1f4d8;前言 书接上文&#xff0c;我们已经学习了 Linux 中的编辑器 vim 的相关使用方法&#xff0c;现在已经能直接在 Linux 中编写C/C代码&#xff0c;有了代码之后就要尝试去编译并运行它&#xff0c;此时就可以学习一下 Linux 中的编译器 gcc/g 了&#xff0c;我们一…

微信小程序文字混合、填充动画有效果图

效果图 .wxml <view class"text" style"--deg:{{deg}}deg;"><view>混合父级颜色</view> </view> <view class"fill {{status?action:}}">文字颜色填充</view> <button bind:tap"setStatus"…

C++:PTA L1-006 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567&#xff0c;其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c;并输出最小的连续因子序列。 输入格式&#xff1a; 输入在一行中给出一…

分享:批量提取图片文字并自动命名文件,ocr识别图片指定区域并重命名文件名工具,基于WPF和腾讯OCR识别的接口的视线方案

一、项目背景 在处理大量图片时,常常需要从图片中提取特定区域的文字信息,并依据这些信息对图片进行重命名。例如,在档案管理领域,大量纸质文件被扫描成图片后,需要从图片中提取关键信息(如文件编号、日期等)来重命名图片,以便后续的检索和管理;在电商领域,商家可能…

汇编语言中的数据

在汇编语言中&#xff0c;程序都是由指令流构成的&#xff0c;而指令一般是由操作符和操作数组成的&#xff0c;操作符是CPU用来完成某项功能的操作&#xff0c;而操作数是操作符所处理加工的对象。比如&#xff1a;add eax, 42&#xff0c;add是执行一个加法运算的操作符&…

C++17 信号量模拟实现

C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有)&#xff0c;但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑&#xff1a; #include <mutex> #include <condition_variable>class CountingSemaphore { private:…

C++ 网络层接口设计与实现:基于 Socket 编程

在网络编程中&#xff0c;网络层是 OSI 七层模型中负责将数据从源节点传输到目的节点的关键层次。在 C 中&#xff0c;网络层的功能通常通过 Socket 编程接口来实现。Socket 提供了一种抽象机制&#xff0c;允许应用程序通过网络发送和接收数据。本文将详细介绍如何在 C 中使用…

uniapp中uni-easyinput 使用@input 不改变绑定的值

只允许输入数字和字母 使用input 正则replace后赋值给A 遇到问题: 当输入任意连续的非法字符时, 输入框不变. 直到输入一个合法字符非法字符才成功被过滤. <uni-forms-item label"纳税人识别号" name"number"><uni-easyinput v-model"numb…

Docker安装hoppscotch

Docker安装hoppscotch 1 简介 1.1 Hoppscotch‌系统 ‌Hoppscotch‌是一个轻量、高效的[API开发生态系统&#xff0c;开源于2020年&#xff0c;原名Postwoman&#xff0c;后更名为Hoppscotch。它基于Node.js构建&#xff0c;支持多种HTTP请求方法&#xff0c;包括GET、POST、…

1.Axum 与 Tokio:异步编程的完美结合

摘要 深入解析 Axum 核心架构与 Tokio 异步运行时的集成&#xff0c;掌握关键原理与实践技巧。 一、引言 在当今的软件开发领域&#xff0c;高并发和高性能是衡量一个系统优劣的重要指标。对于 Web 服务器而言&#xff0c;能够高效地处理大量并发请求是至关重要的。Rust 语言…

CSS伪元素

伪元素 伪元素 用于在元素的内容前后或特定部分插入虚拟元素&#xff0c;并为其添加样式&#xff0c;无需修改 HTML 结构。 语法&#xff1a;使用双冒号 ::&#xff08;现代规范&#xff09; 以下是一些常见的CSS伪元素的示例&#xff1a; 1.::before &#xff1a; 在元素内…

easyexcel使用模板填充excel坑点总结

1.单层map设置值是{属性}&#xff0c;那使用两层map进行设置值&#xff0c;是不是可以使用{属性.属性}&#xff0c;以为取出map里字段只用{属性}就可以设置值&#xff0c;那再加个.就可以从里边map取出对应属性&#xff0c;没有两层map写法 填充得到的文件打开报错 was empty (…

在Ubuntu服务器上部署xinference

一、拉取镜像 docker pull xprobe/xinference:latest二、启动容器&#xff08;GPU&#xff09; docker run -d --name xinference -e XINFERENCE_MODEL_SRCmodelscope -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0 # 启动一个新的Docker容…

三周年创作纪念日

文章目录 回顾与收获三年收获的五个维度未来的展望致谢与呼唤 亲爱的社区朋友们&#xff0c;大家好&#xff01; 今天是 2025 年 4 月 14 日&#xff0c;距离我在 2022 年 4 月 14 日发布第一篇技术博客《SonarQube 部署》整整 1,095 天。在这条创作之路上&#xff0c;我既感慨…

Redis——五种数据类型

目录 前言 1.String 1.1RAW编码 1.2EMBSTR编码 1.3 INT编码 2.List 3.Set 3.1 InSet编码转化成Dict编码 4.ZSet 4.1结合SkipList和HT实现 4.2使用ZipList实现 4.3编码转换 4.4 ZipList排序功能 5.Hash 5.1Hash底层存储结构 6.Redis数据结构和数据类型关系图 前言…

zookeeper启动报错have small server identifier

解决方案&#xff1a; 1、查看myid是否有重复 2、查看server.X 与myid的X是否一致 3、启动顺序为myid从小到大的服务器顺序

#Linux动态大小裁剪以及包大小变大排查思路

1 动态库裁剪 库分为动态库和静态库&#xff0c;动态库是在程序运行时才加载&#xff0c;静态库是在编译时就加载到程序中。动态库的大小通常比静态库小&#xff0c;因为动态库只包含了程序需要的函数和数据&#xff0c;而静态库则包含了所有的函数和数据。静态库可以理解为引入…

消息队列生产者投递的高可靠性与一致性保障方案

在构建高可靠分布式系统时&#xff0c;确保业务数据库与消息队列&#xff08;MQ&#xff09;之间的一致性是一项核心挑战。尤其当使用 Kafka 作为消息队列中间件时&#xff0c;如何避免“数据库写入成功&#xff0c;但消息发送失败”或“消息重复发送”等问题&#xff0c;成为系…