您现在的位置是:首页 >其他 >通过docker进行golang交叉编译 到mipsle平台网站首页其他

通过docker进行golang交叉编译 到mipsle平台

y_onghuming 2024-06-17 10:48:22
简介通过docker进行golang交叉编译 到mipsle平台

首先为什么会想着用docker来进行交叉编译呢?

  1. 因为Mac的darwin 系统在进行向mipsle平台编译时,很难找到合适的交叉编译链
  2. Linux 平台下比较容易向mipsle平台编译,也有很多博客可以参考

创建Dockerfile文件

FROM ubuntu:18.04

RUN apt-get update && apt-get upgrade -y

RUN apt-get install -y wget
RUN apt-get install -y tar
RUN apt-get install -y vim

RUN wget https://golang.google.cn/dl/go1.18.5.linux-amd64.tar.gz
RUN tar xfz go1.18.5.linux-amd64.tar.gz -C /usr/local

ENV GO111MODULE=on 
    CGO_ENABLED=1 
    GOOS=linux 
    GOARCH=mipsle 
    CC=/opt/bin/mipsel-linux-uclibc-gcc 
    CXX=/opt/bin/mipsel-linux-uclibc-g++ 
    GOROOT=/usr/local/go 
    GOPATH=$HOME/gowork 
    GOBIN=$GOPATH/bin 

    PATH=/opt/bin 
    PATH=/bin:/usr/bin:$PATH 
    PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH


WORKDIR /encryptionGateway

COPY go.mod .
COPY go.sum .
COPY mipsel-linux-uclibc.tar.xz .

RUN tar xvf mipsel-linux-uclibc.tar.xz -C /opt

RUN /usr/local/go/bin/go mod download

COPY . .

RUN sh ./build.sh

创建一个ubuntu的系统环境镜像文件

  1. 安装wget,是为了下载比较新的版本的golang文件,apt-get只能获取到1.10版本的golang,低于1.14版本的golang是没法使用go mod的
  2. 安装tar,解压下载的golang压缩包到指定的目录,解压上传的编译链压缩包到指定的目录
  3. 安装vim,用于编辑文本
  4. ENV指定一些环境变量,特别是CGO_ENABLED,GOOS,GOARCH等参数
  5. WORKDIR指定文件目录
  6. COPY拷贝文件数据,先拷贝go.mod,是go程序的依赖文件
  7. COPY ipsel-linux-uclibc.tar.xz文件,并进行解压----交叉编译链文件
  8. 下载go依赖
  9. 上传项目到工作目录
  10. sh ./build.sh 运行脚本文件生成执行二进制文件
  11. docker run -it docker_image_id 进入容器,得到运行容器的id
  12. 拷贝文件
    1. 容器中的二进制文件到宿主机
      1. docker cp 04f6fc34b86e:/encryptionGateway/guazai/main /Users/lyr/Desktop/work/encryptionGateway/guazai
      2. docker cp 容器id:容器文件地址 宿主机地址
    2. 宿主机的文件到容器
      1. docker cp /Users/lyr/Desktop/work/encryptionGateway/guazai 04f6fc34b86e:/encryptionGateway/guazai/main
      2. docker cp 宿主机文件地址 容器id:容器文件地址

例如:

我将go build的命令写成了脚本:

#!/bin/bash

echo "开始编译..."

go build -ldflags="-s -w" -o main -v -tags netgo -installsuffix netgo -ldflags '-extldflags "-static"' -a -x -v -ldflags '-w -s -linkmode external -extldflags "-static -lpthread"'

echo "编译结束..."

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。