首先为什么会想着用docker来进行交叉编译呢?
- 因为Mac的darwin 系统在进行向mipsle平台编译时,很难找到合适的交叉编译链
- 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的系统环境镜像文件
- 安装wget,是为了下载比较新的版本的golang文件,apt-get只能获取到1.10版本的golang,低于1.14版本的golang是没法使用go mod的
- 安装tar,解压下载的golang压缩包到指定的目录,解压上传的编译链压缩包到指定的目录
- 安装vim,用于编辑文本
- ENV指定一些环境变量,特别是CGO_ENABLED,GOOS,GOARCH等参数
- WORKDIR指定文件目录
- COPY拷贝文件数据,先拷贝go.mod,是go程序的依赖文件
- COPY ipsel-linux-uclibc.tar.xz文件,并进行解压----交叉编译链文件
- 下载go依赖
- 上传项目到工作目录
- sh ./build.sh 运行脚本文件生成执行二进制文件
- docker run -it docker_image_id 进入容器,得到运行容器的id
- 拷贝文件
- 容器中的二进制文件到宿主机
- docker cp 04f6fc34b86e:/encryptionGateway/guazai/main /Users/lyr/Desktop/work/encryptionGateway/guazai
- docker cp 容器id:容器文件地址 宿主机地址
- 宿主机的文件到容器
- docker cp /Users/lyr/Desktop/work/encryptionGateway/guazai 04f6fc34b86e:/encryptionGateway/guazai/main
- 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 "编译结束..."