使用源码编译安装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
相关文章:
使用源码编译安装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…...
使用 chromedriver 实现网络爬虫【手抄】
1、引用 selenium 包 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version> </dependency> <dependency><groupId>org.seleniumhq.seleniu…...
Linux之 grep、find、ls、wc 命令
Linux之 grep、find、ls、wc 命令 “ 在 Linux 世界中,命令行是不可或缺的一部分,而掌握一些常用的命令可以帮助你更有效率地管理文件和系统。本文将为你介绍四個基礎而强大的 Linux 命令:grep、find、ls 和 wc,带你开启高效文件…...
AI 模型高效化:推理加速与训练优化的技术原理与理论解析
AI 模型高效化:推理加速与训练优化的技术原理与理论解析 文章目录 AI 模型高效化:推理加速与训练优化的技术原理与理论解析一、推理加速:让模型跑得更快的“程序员魔法”(一)动态结构自适应推理:像人类一样…...
c++STL——vector的使用和模拟实现
文章目录 vector的使用和模拟实现vector的使用vector介绍重点接口的讲解迭代器部分默认成员函数空间操作增删查改操作迭代器失效问题(重要)调整迭代器 vector的模拟实现实现的版本模拟实现结构预先处理的函数尾插函数push_backswap函数赋值重载size函数reserve函数 迭代器默认成…...
git更新的bug
文章目录 1. 问题2. 分析 1. 问题 拉取了一个项目后遇到了这个问题, nvocation failed Server returned invalid Response. java.lang.RuntimeException: Invocation failed Server returned invalid Response. at git4idea.GitAppUtil.sendXmlRequest(GitAppUtil…...
github | 仓库权限管理 | 开权限
省流版总结: github 给别人开权限:仓库 -> Setting -> Cllaborate -> Add people GitHub中 将公开仓库改为私有:仓库 -> Setting -> Danger Zone(危险区) ->Change repository visibility( 更改仓…...
MQTT客户端核心架构解析:clients.h源码深度解读
MQTT客户端核心架构解析:clients.h源码深度解读 一、头文件概览与设计哲学 clients.h作为MQTT客户端核心数据结构定义文件,体现了以下设计原则: 分层架构:网络层/协议层/业务层解耦状态管理:通过状态机实现复杂协议…...
uniapp自定义底部导航栏,解决下拉时候顶部空白的问题
一、背景 最近使用uniapp开发微信小程序,因为使用了自定义的顶部导航栏,所以在ios平台上(Android未测试)测试的时候,下拉的时候会出现整个页面下拉并且顶部留下大片空白的问题 二、任务:解决这个问题 经…...
C++学习之密码学知识
目录 1.文档介绍 2.知识点概述 3.项目准备 4.序列化介绍 5.项目中基础组件介绍 6.基础模块在项目中作用 7.项目中其他模块介绍 8.加密三要素 9.对称加密和非堆成加密 10.对称和非对称加密特点 11.堆成加密算法des 12.des对称加密算法 13.对称加密算法aes 14.知识点…...
力扣 797. 所有可能的路径
题目 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一…...
第二篇:linux之Xshell使用及相关linux操作
第二篇:linux之Xshell使用及相关linux操作 文章目录 第二篇:linux之Xshell使用及相关linux操作一、Xshell使用1、Xshell安装2、Xshell使用 二、Bash Shell介绍与使用1、什么是Bash Shell(壳)?2、Bash Shell能干什么?3、平时如何使…...
全自动驾驶(FSD,Full Self-Driving)自动驾驶热点技术的成熟之处就是能判断道路修复修路,能自动利用类似“人眼”的摄像头进行驾驶!值得学习!
全自动驾驶(FSD,Full Self-Driving)软件是自动驾驶领域中的热点技术,其核心目标是实现车辆在各种复杂交通环境下的安全、稳定、高效自动驾驶。FSD软件的技术核心涉及多个方面的交叉技术,下面将详细分析说明其主要核心技…...
SpringBoot项目动态加载jar 实战级别
网上也找到类似的文章,但是基本都不到实用级别,就是不能直接用。在参照网上的文章及与AI沟通N次后终于完善可以在实际项目上 创建jar文件动态加载类 Component Slf4j public class PluginRegistry {Autowiredprivate GenericApplicationContext applicat…...
一种改进的CFAR算法用于目标检测(解决多目标掩蔽)
摘要 恒虚警率(CFAR)技术在雷达自动检测过程中起着关键作用。单元平均(CA)CFAR算法在几乎所有的多目标情况下都会受到掩蔽效应的影响。最小单元平均(SOCA)CFAR算法仅当干扰目标位于参考窗口的前后方时才具有…...
无人机+智能监控:石油管道巡检迈入“空中智慧时代”
引言:安全与效率的双重革命 在广袤的沙漠、崎岖的山脉或人迹罕至的冻土带,石油管道的安全巡检曾是一项耗时耗力且风险极高的任务。如今,随着无人机巡检技术与视频监控管理平台的深度融合,石油行业正迎来一场智能化变革——从“人巡…...
Python内置函数---anext()
用于异步迭代器的核心工具,专为处理异步数据流设计。 1. 基本语法 await anext(async_iterator, default) 参数: async_iterator :实现了异步迭代协议的对象(如异步生成器、异步迭代器类)。 default (可选…...
4.17学习总结
完成135. 分发糖果 - 力扣(LeetCode)的算法 学习了字节缓冲流和字符缓冲流,了解了底层的原理,...
【gpt生成-其一】以go语言为例,详细描述一下 :语法规范BNF/EBNF形式化描述
在 Go 语言中通过 EBNF 形式化描述语法规范需要结合语言规范文档的结构,以下是详细实现方法及标准规范示例: 一、Go 语法规范结构(基于 Go 1.21 标准) ebnf 复制 // 基础元素定义 letter "A" ... "Z&quo…...
用cython将python程序打包成C++动态库(windows+Vistual Studio2017平台)
作为一名程序员我们都知道Python的库可能要比C的丰富的多特别是在算法方面,但是有的时候我们的工程是用C开发的,我们又像用Python的这个库那怎么办呢?如果直接调.py程序,工程中代码有.py又有.cpp显得工程很杂乱。那么我么可以借助…...
三层交换机SVI功能(交换机虚拟接口)实现各个实训室电脑网络可互通,原本是独立局域网
三层交换机 SVI功能(交换机虚拟接口) 实现VLAN路由 需求 :各实训室使用独立局域网,即每个实训有自己的IP网段, 每个实训室只有内部互相访问。 需求:为了加强各实训室学生的交流,学校要求我们…...
class的访问器成员
class的访问器成员 本质是 class 的语法糖 等价于对象的defineProperty对象里面也能使用 class Product{constructor(count, price){this.count count;this.price price;}get total(){ // 相当于getterreturn this.count * this.price;}}const product new Product(10, 10…...
vue入门:路由 router
文章目录 介绍安装配置路由模式嵌套路由路由传参编程式导航路由懒加载 底层原理 介绍 vue2 vue router API vue3 vue router API Vue Router 是 Vue.js 的官方路由管理器,它允许你通过不同的 URL 显示不同的组件,从而实现单页面应用(SPA&a…...
JVM详解(曼波脑图版)
(✪ω✪)ノ 好哒!曼波会用最可爱的比喻给小白同学讲解JVM,准备好开启奇妙旅程了吗?(๑˃̵ᴗ˂̵)و 📌 思维导图 ━━━━━━━━━━━━━━━━━━━ 🍎 JVM是什么?(苹果式比…...
Prometheus thanos架构
Thanos 是一个用于扩展 Prometheus 的高可用性和长期存储的解决方案。它通过整合多个 Prometheus 实例,提供了全局查询、长期存储、以及高可用性的能力。Thanos 的架构主要由以下几个核心组件组成: 1. Sidecar 功能: Sidecar 是与每个 Prom…...
进程(Process)和进程管理
李升伟 整理 进程和进程管理是操作系统的核心概念之一,涉及计算机资源的分配、调度和执行控制。以下是详细的解释: 1. 进程的定义 进程(Process)是正在执行的程序实例,是操作系统进行资源分配和调度的基本单位。它包…...
更强的视觉 AI!更智能的多模态助手!Qwen2.5-VL-32B-Instruct-AWQ 来袭
Qwen2.5-VL-32B-Instruct 是阿里巴巴通义千问团队于 2025 年 3 月 24 日开源的多模态大模型,基于 Apache 2.0 协议发布。该模型在 Qwen2.5-VL 系列的基础上,通过强化学习技术优化,以 32B 参数规模实现了多模态能力的突破。 核心特性升级&…...
Linux系统中的Perf总结
Linux系统中的Perf总结 Perf 是一个集成在 Linux 内核中的强大性能分析工具,在 Ubuntu 系统上尤为实用。它可以帮助用户监控和分析 CPU、内存、I/O 等性能指标。本文将一步步详解 Perf 在 Ubuntu 系统中的安装、使用方法及进阶技巧,带你从入门走向精通。…...
每日算法-250417
每日算法 - 20250417 记录今天的算法学习过程,包含三道 LeetCode 题目。 1005. K 次取反后最大化的数组和 题目 思路 贪心 解题过程 想要获得最大的数组和,我们的目标是尽可能地增大数组元素的总和。一种有效的贪心策略是:每次选择数组中绝…...
16.4B参数仅激活2.8B!Kimi-VL-A3B开源:长文本、多模态、低成本的AI全能选手
近日,月之暗面(Moonshot AI)开源了Kimi-VL系列模型,包含Kimi-VL-A3B-Instruct(指令调优版)和Kimi-VL-A3B-Thinking(推理增强版)。这两款模型以总参数16.4B、激活参数仅2.8B的轻量化设…...
