使用源碼編譯安裝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.pswp.cn/pingmian/77300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77300.shtml
英文地址,請注明出處:http://en.pswp.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;成為系…