国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Docker多平臺、跨平臺編譯打包

這篇具有很好參考價值的文章主要介紹了Docker多平臺、跨平臺編譯打包。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大多數(shù)帶有Docker官方標識的鏡像都提供了多架構支持。如:busybox鏡像支持amd64,?arm32v5,?arm32v6,?arm32v7,?arm64v8,?i386,?ppc64le, and?s390x。當你在amd64設備上運行容器時,會拉取amd64鏡像。

當你需要構建多平臺鏡像時,可以用 --platform 參數(shù)指定目標平臺,但是通常情況下,你只能一次構建一個單一架構平臺的鏡像。如果想要一次構建多平臺鏡像,你需要使用docker container build driver,可以使用buildx插件進行配置,替換打包命令。

QEMU

跨平臺打包可以使用QEMU,但是它比本機構建慢得多,依賴QEMU將本機指令轉(zhuǎn)義為目標架構指令,從而實現(xiàn)跨平臺編譯。一般Linux kernel 4.8以后版本,支持binfmt-support 2.1.7及以上版本的平臺,都能支持跨平臺編譯。你可以用以下步驟快速開啟:

docker run --privileged --rm tonistiigi/binfmt --install all

為不同架構平臺創(chuàng)建本地節(jié)點,--apend可以追加到同一個構建器中:

docker buildx create --use --name mybuild node-amd64
mybuild
docker buildx create --append --name mybuild node-arm64

同時構建多平臺鏡像:

docker buildx build --platform linux/amd64,linux/arm64 .

這里用buildx插件代替默認build,一次打包多平臺鏡像,不做過多介紹。

交叉編譯

docker可以輕松打包多平臺的鏡像,但是目標程序的交叉編譯取決于開發(fā)編譯環(huán)境。Golang就很容易實現(xiàn)交叉編譯,結合docker多階段構建技術,可以實現(xiàn)一次編譯打包多平臺鏡像。

首先安裝buildx插件,

下載?

?重命名并放到docker插件目錄里:

mv buildx-v0.11.2.linux-amd64 docker-buildx
mkdir .docker/cli-plugins -p
mv docker-buildx .docker/cli-plugins/
chmod +x .docker/cli-plugins/docker-buildx

docker-compose也可以作為插件放到插件目錄里,

mv docker-compose .docker/cli-plugins/

使用時可用如下的命令,無需使用docker-compose,這是題外話。

docker compose up -d

?其次創(chuàng)建構建器,

$ docker buildx ls
NAME/NODE    DRIVER/ENDPOINT             STATUS  BUILDKIT       PLATFORMS
mybuilder *  docker-container
  mybuilder0 unix:///var/run/docker.sock running v0.12.3        linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default      docker
  default    default                     running v0.8.2+eeb7b65 linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6

ls命令列出已有的構建器,default是docker默認的構建器,mybuilder是我創(chuàng)建的構建器,可以用如下命令進行創(chuàng)建,

docker buildx create --name mybuilder --bootstrap --use

這條命令會創(chuàng)建mybuilder構建器,并啟動,設置為默認構建器。

到這里環(huán)境就算配置好了,但是要想編譯打包多平臺鏡像,還需要編輯Dockerfile,

FROM --platform=$BUILDPLATFORM golang:latest AS builder
ARG TARGETARCH
RUN apt-get update && apt-get install -y gcc-aarch64-linux-gnu
WORKDIR /app
COPY . .
RUN go env -w GOOS=linux GOARCH=$TARGETARCH CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct
RUN if [ "$TARGETARCH" = "arm64" ]; then go env -w AR=aarch64-linux-gnu-ar CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++; fi
RUN go mod tidy
RUN go build -a -ldflags '-extldflags "-static"' -o server main.go

FROM alpine:latest
RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk update && apk add sqlite
WORKDIR /server
RUN mkdir -p /server/data
COPY --from=builder /app/server /app/config.docker.yaml ./
COPY --from=builder /app/resource/cert ./resource/cert
EXPOSE 8660
ENTRYPOINT ./server -c config.docker.yaml

上面的Dockerfile采用多階段構建方式支持交叉編譯,多平臺打包。

第一階段進行交叉編譯

第二階段進行目標平臺鏡像打包

里面用到docker-container驅(qū)動的環(huán)境變量有:

BUILDPLATFORM? 編譯平臺,即當前宿主機的平臺架構

TARGETPLATFORM

BUILDARCH
TARGETARCH 目標平臺架構,即多平臺編譯打包時的目標架構

GOARCH=$TARGETARCH 指定了Go編譯目標架構?

golang:latest、alpine:latest鏡像都是支持多架構的鏡像,golang:latest是基于debian構建,為了交叉編譯,需要安裝交叉編譯環(huán)境,

apt-get install -y gcc-aarch64-linux-gnu

?因為Go程序中用到了cgo特性,需要打開它

CGO_ENABLED=1

同時,如果目標平臺是arm64的話,需配置go gcc等編譯器環(huán)境變量

RUN if [ "$TARGETARCH" = "arm64" ]; then go env -w AR=aarch64-linux-gnu-ar CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++; fi

當然,第一步也可以直接在目標平臺編譯,不過速度有點洗人:

FROM --platform=$TARGETPLATFORM golang:1.21 AS builder
ARG TARGETARCH
RUN set -eux && sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
RUN apt-get update && apt-get install -y libssl-dev g++
WORKDIR /app
COPY . .
RUN go env -w GOOS=linux GOARCH=$TARGETARCH CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct
RUN go mod tidy
RUN go build -a -ldflags '-extldflags "-static"' -o server main.go

最后,執(zhí)行buildx命令

docker buildx build --platform linux/arm64,linux/amd64 -t 172.16.60.12:8888/star/iot-go . --push

編譯打包多平臺鏡像并推送到倉庫中。也可以輸出單一平臺,并保存到本地,

docker buildx build --platform linux/arm64 -t star/iot-go . --load

參考資料:

Multi-platform images?| Docker Docs

How to use docker buildx to build multi-architecture Go images文章來源地址http://www.zghlxwxcb.cn/news/detail-740913.html

到了這里,關于Docker多平臺、跨平臺編譯打包的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【QT+QGIS跨平臺編譯】之五:【curl+Qt跨平臺編譯】(一套代碼、一套框架,跨平臺編譯)

    【QT+QGIS跨平臺編譯】之五:【curl+Qt跨平臺編譯】(一套代碼、一套框架,跨平臺編譯)

    (libcurl編譯,依賴OpenSSL、libSSH2等庫) curl(CommandLine Uniform Resource Locator)主要功能就是用不同的協(xié)議連接和溝通不同的服務器,相當封裝了的socket。 libcurl支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協(xié)議。libcurl同樣支持HTTPS證書授權,HTTP POST, HTTP PUT, FTP 上傳(當然你也可

    2024年01月23日
    瀏覽(162)
  • 【QT+QGIS跨平臺編譯】之八:【zstd+Qt跨平臺編譯】(一套代碼、一套框架,跨平臺編譯)

    【QT+QGIS跨平臺編譯】之八:【zstd+Qt跨平臺編譯】(一套代碼、一套框架,跨平臺編譯)

    【libzstd跨平臺編譯】:Windows環(huán)境下編譯成果(支撐QGIS跨平臺編譯,以及二次研發(fā)) 【libzstd跨平臺編譯】?

    2024年01月25日
    瀏覽(165)
  • 【QT+QGIS跨平臺編譯】之三:【OpenSSL+Qt跨平臺編譯】(一套代碼、一套框架,跨平臺編譯)

    OpenSSL是一個開放源代碼的軟件庫包,應用程序可以使用這個包來進行安全通信,避免竊聽,同時確認另一端連接者的身份。這個包廣泛被應用在互聯(lián)網(wǎng)的網(wǎng)頁服務器上。 SSL是Secure Sockets Layer(安全套接層協(xié)議)的縮寫,可以在Internet上提供秘密性傳輸。SSL能使用戶/服務器應用

    2024年01月22日
    瀏覽(168)
  • 【QT+QGIS跨平臺編譯】之三十六:【RasterLite2+Qt跨平臺編譯】(一套代碼、一套框架,跨平臺編譯)

    【QT+QGIS跨平臺編譯】之三十六:【RasterLite2+Qt跨平臺編譯】(一套代碼、一套框架,跨平臺編譯)

    RasterLite2是一個開源的輕量級柵格數(shù)據(jù)庫,可以用于存儲和管理各種類型的柵格數(shù)據(jù),包括衛(wèi)星遙感圖像、數(shù)字高程模型等。 與傳統(tǒng)的GIS數(shù)據(jù)存儲方式不同,RasterLite2采用基于SQLite的數(shù)據(jù)庫引擎,支持快速的數(shù)據(jù)查詢和空間分析操作。同時,由于其輕量級的設計,RasterLite2可以

    2024年02月19日
    瀏覽(103)
  • 跨平臺編譯go(交叉編譯)

    跨平臺編譯go(交叉編譯)

    以將一個簡單的go http 部署到docker為例! Dockerfile文件 docker build . -t goweb_app docker run -p 8888:8888 goweb_app 在最終的鏡像中是不需要go編譯器的,也就是說只需要一個運行最終二進制文件的容器即可。 Golang 支持交叉編譯,在一個平臺上生成另一個平臺的可執(zhí)行程序。 golang中跨平臺

    2024年02月07日
    瀏覽(37)
  • ffmpeg跨平臺arm編譯-ubuntu

    32位系統(tǒng): 64位系統(tǒng): 關鍵選項: –arch=arm:指定ARM平臺 –target-os=linux:指定Linux系統(tǒng) –enable-cross-compile :指定交叉編譯 –cross-prefix=arm-linux-gnueabihf-:指定交叉編譯鏈 如果是64位系統(tǒng): –arch=aarch64:指定ARM平臺 –cross-prefix=aarch64-linux-gnu-:指定交叉編譯鏈

    2024年02月08日
    瀏覽(88)
  • rust包跨平臺編譯,macbook ,linux

    在 MacBook 上編譯 Rust 項目并生成 Linux 包需要一些步驟。以下是一般的步驟概述: 1. **安裝所需工具:** ? ?首先,確保您的 MacBook 上已經(jīng)安裝了所需的工具。您需要 Rust 編程語言的工具鏈以及一些用于交叉編譯到 Linux 的工具。 ? ?- 安裝 Rust 工具鏈:您可以在終端中運行以下

    2024年02月12日
    瀏覽(28)
  • Windows平臺visual studio與樹莓派跨平臺交叉編譯opencv

    Windows平臺visual studio與樹莓派跨平臺交叉編譯opencv

    由于架構差異,opencv在Windows平臺下編譯的程序無法直接移植到樹莓派環(huán)境使用,所以需要進行Cmake和跨平臺的交叉編譯。網(wǎng)上包括官方文檔很多足夠參考,但配置過程中依然會出現(xiàn)個性問題,以下是本人基于windows下使用visual studio2017集成開發(fā)環(huán)境進行交叉編譯環(huán)境配置過程中

    2024年04月11日
    瀏覽(30)
  • 最佳實踐-使用Github Actions來構建跨平臺容器鏡像

    公眾號「架構成長指南」,專注于生產(chǎn)實踐、云原生、分布式系統(tǒng)、大數(shù)據(jù)技術分享。 最近在寫K8s的相關系列文章,因為有涉及到鏡像構建,發(fā)現(xiàn)在Mac m1的Arm架構下構建的部分鏡像,沒法在X86架構下使用,不兼容。 嘗試網(wǎng)上介紹的各種方式,都已失敗告終,效果如下: 最終

    2024年02月05日
    瀏覽(25)
  • web前端項目使用electron打包成跨平臺桌面端程序(Windows)

    web前端項目使用electron打包成跨平臺桌面端程序(Windows)

    Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面應用程序的框架。 嵌入 Chromium 和 Node.js 到 二進制的 Electron 允許您保持一個 JavaScript 代碼代碼庫并創(chuàng)建 在Windows上運行的跨平臺應用 macOS和Linux——不需要本地開發(fā) 經(jīng)驗。 在使用Electron進行開發(fā)之前,您需要安裝 Node.js。 我們建

    2024年02月16日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包