docker容器中編譯go項(xiàng)目

項(xiàng)目正在逐步使用go mod工具做版本管理带到,但是在這過程中也遇到了一些問題缚柳,主要還是交叉編譯的問題

之前項(xiàng)目在GOPATH中,編譯就交給xgo這個(gè)工具來做鸥跟,一直很順利丢郊,但是xgo是不支持非GOPATH目錄的項(xiàng)目的,如果將項(xiàng)目移到其他目錄中医咨,并使用xgo來編譯枫匾,會(huì)出現(xiàn)如下的錯(cuò)誤:

Checking for required docker image karalabe/xgo-latest... found.
Cross compiling ....
Building locally ....
Compiling for linux/arm64...
can't load package: package .: no Go files in /
2019/05/16 14:24:52 Failed to cross compile package: exit status 1.

用到xgo主要是因?yàn)轫?xiàng)目中引用了github.com/mattn/go-sqlite3,而且編譯的二進(jìn)制主要運(yùn)行在arm平臺(tái)上拟淮,所以用到了交叉編譯

目標(biāo)平臺(tái)是arm64架構(gòu)的ubuntu16.04干茉,自己正在用的是amd64架構(gòu)的ubuntu19.04,在安裝了各種gcc后也能編譯出arm64的二進(jìn)制惩歉,但是運(yùn)行時(shí)會(huì)報(bào)錯(cuò):

anet@anet-box:/data$ ./minioext 
./minioext: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by ./minioext)

查看GLIBC版本

anet@anet-box:/lib/aarch64-linux-gnu$ strings libc.so.6 |grep GLIBC_ 
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_PRIVATE

目標(biāo)平臺(tái)版本太低等脂,而我自己的系統(tǒng)又太高,所以編譯出來的二進(jìn)制無法運(yùn)行撑蚌,自己系統(tǒng)上編譯器是arm-linux-gnueabi-gcc-7以及aarch64-linux-gnu-gcc-7上遥,版本也是太高了

在查看了xgo的shell腳本后,發(fā)現(xiàn)xgo使用的是arm-linux-gnueabi-gcc-5争涌,所有的toolchain都是5系列的粉楚,但是通過執(zhí)行命令

apt-cache search gcc-5-arm-linux-gnueabi

來搜索gcc-5*發(fā)現(xiàn)是沒結(jié)果的,

apt-cache search gcc-7-arm-linux-gnueabi

是有結(jié)果的亮垫,所以可以猜測ubuntu19.04應(yīng)該去掉了gcc-5*的源信息模软,自己安裝的話需要解決很多的依賴問題,所以只好采用另一種方案饮潦,順便熟悉一下docker

其實(shí)也就是使用xgo中的docker鏡像來進(jìn)行編譯燃异,省得自己再重新創(chuàng)建容器并安裝各種庫

GOPATH: ~/Workbench/golang/

本地項(xiàng)目位置:
~/Workbench/project/

$ docker images

// 輸出
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
karalabe/xgo-latest   latest              2ba69a095751        2 months ago        5.01GB
hello-world           latest              fce289e99eb9        4 months ago        1.84kB

$ docker run --rm -v ~/Workbench/project/:/build -v ~/Workbench/golang/src/:/go/src -it karalabe/xgo-latest /bin/bash

進(jìn)入容器后會(huì)一直輸出

/build.sh: line 65: /usr/bin/dirname: Argument list too long
/build.sh: line 65: /usr/bin/dirname: Argument list too long
/build.sh: line 65: /usr/bin/dirname: Argument list too long

導(dǎo)致該shell用不了,所以需要另外開啟一個(gè)shell來進(jìn)行操作

$ docker ps

// 輸出
CONTAINER ID        IMAGE                 COMMAND                 CREATED             STATUS              PORTS               NAMES
de72bd416888        karalabe/xgo-latest   "/build.sh /bin/bash"   14 seconds ago      Up 13 seconds                           adoring_greider

$ docker exec -it de72bd416888 /bin/bash

進(jìn)入到容器后继蜡,可以執(zhí)行編譯命令進(jìn)行編譯

root@de72bd416888:/# cd build
root@de72bd416888:/build# CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc-5 go build

// 編譯完成后關(guān)閉容器即可

root@de72bd416888:/build# exit

$ docker container stop de72bd416888

過程比較曲折回俐,但是也算是解決了問題,如果有時(shí)間的話稀并,可以搭建自己的ubuntu鏡像仅颇,或者說自己封裝一套工具也是可以的

下面是從xgo項(xiàng)目中挑出來的一些東西,感覺挺有用碘举,貼出來

  1. 創(chuàng)建ubuntu16.04容器時(shí)忘瓦,需要安裝的package

# Make sure apt-get is up to date and dependent packages are installed
RUN \
  apt-get update && \
  apt-get install -y automake autogen build-essential ca-certificates                    \
    gcc-5-arm-linux-gnueabi g++-5-arm-linux-gnueabi libc6-dev-armel-cross                \
    gcc-5-arm-linux-gnueabihf g++-5-arm-linux-gnueabihf libc6-dev-armhf-cross            \
    gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu libc6-dev-arm64-cross                \
    gcc-5-mips-linux-gnu g++-5-mips-linux-gnu libc6-dev-mips-cross                       \
    gcc-5-mipsel-linux-gnu g++-5-mipsel-linux-gnu libc6-dev-mipsel-cross                 \
    gcc-5-mips64-linux-gnuabi64 g++-5-mips64-linux-gnuabi64 libc6-dev-mips64-cross       \
    gcc-5-mips64el-linux-gnuabi64 g++-5-mips64el-linux-gnuabi64 libc6-dev-mips64el-cross \
    gcc-5-multilib g++-5-multilib gcc-mingw-w64 g++-mingw-w64 clang llvm-dev             \
    libtool libxml2-dev uuid-dev libssl-dev swig openjdk-8-jdk pkg-config patch          \
    make xz-utils cpio wget zip unzip p7zip git mercurial bzr texinfo help2man           \
    --no-install-recommends

# Fix any stock package issues
RUN ln -s /usr/include/asm-generic /usr/include/asm

  1. 交叉編譯時(shí)各個(gè)平臺(tái)的CC列表
// android arm7
CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ GOOS=android GOARCH=arm GOARM=7 CGO_ENABLED=1 

// android 386
CC=i686-linux-android-gcc CXX=i686-linux-android-g++ GOOS=android GOARCH=386 CGO_ENABLED=1 

// android arm64
CC=aarch64-linux-android-gcc CXX=aarch64-linux-android-g++ GOOS=android GOARCH=arm64 CGO_ENABLED=1
          
// linux armv5     
CC=arm-linux-gnueabi-gcc-5 CXX=arm-linux-gnueabi-g++-5 GOOS=linux GOARCH=arm GOARM=5 CGO_ENABLED=1 CGO_CFLAGS="-march=armv5" CGO_CXXFLAGS="-march=armv5" 
    
// linux armv6
CC=arm-linux-gnueabi-gcc-5 GOOS=linux GOARCH=arm GOARM=6 CGO_ENABLED=1 CGO_CFLAGS="-march=armv6" CGO_CXXFLAGS="-march=armv6"

// linux armv7-a
CC=arm-linux-gnueabihf-gcc-5 CXX=arm-linux-gnueabihf-g++-5 GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CGO_CFLAGS="-march=armv7-a -fPIC" CGO_CXXFLAGS="-march=armv7-a -fPIC"
   
// linux arm64
CC=aarch64-linux-gnu-gcc-5 CXX=aarch64-linux-gnu-g++-5 GOOS=linux GOARCH=arm64 CGO_ENABLED=1
    
// linux mips64
CC=mips64-linux-gnuabi64-gcc-5 CXX=mips64-linux-gnuabi64-g++-5 GOOS=linux GOARCH=mips64 CGO_ENABLED=1

// linux mips64le
CC=mips64el-linux-gnuabi64-gcc-5 CXX=mips64el-linux-gnuabi64-g++-5 GOOS=linux GOARCH=mips64le CGO_ENABLED=1
 
// linux mips
CC=mips-linux-gnu-gcc-5 CXX=mips-linux-gnu-g++-5 GOOS=linux GOARCH=mips CGO_ENABLED=1 

// linux mipsle
CC=mipsel-linux-gnu-gcc-5 CXX=mipsel-linux-gnu-g++-5 GOOS=linux GOARCH=mipsle CGO_ENABLED=1

// windows amd64
CC=x86_64-w64-mingw32-gcc-posix CXX=x86_64-w64-mingw32-g++-posix GOOS=windows GOARCH=amd64 CGO_ENABLED=1

// windows 386
CC=i686-w64-mingw32-gcc-posix CXX=i686-w64-mingw32-g++-posix GOOS=windows GOARCH=386 CGO_ENABLED=1 

// darwin amd64
CC=o64-clang CXX=o64-clang++ GOOS=darwin GOARCH=amd64 CGO_ENABLED=1

// darwin 386   
CC=o32-clang CXX=o32-clang++ GOOS=darwin GOARCH=386 CGO_ENABLED=1

// ios arm-7
CC=arm-apple-darwin11-clang CXX=arm-apple-darwin11-clang++ GOOS=darwin GOARCH=arm GOARM=7 CGO_ENABLED=1

// ios arm64
GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 CC=arm-apple-darwin11-clang

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市引颈,隨后出現(xiàn)的幾起案子耕皮,更是在濱河造成了極大的恐慌,老刑警劉巖线欲,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件明场,死亡現(xiàn)場離奇詭異,居然都是意外死亡李丰,警方通過查閱死者的電腦和手機(jī)苦锨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趴泌,“玉大人舟舒,你說我怎么就攤上這事∈茹荆” “怎么了秃励?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吉捶。 經(jīng)常有香客問我夺鲜,道長皆尔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任币励,我火速辦了婚禮慷蠕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘食呻。我一直安慰自己流炕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布仅胞。 她就那樣靜靜地躺著每辟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪干旧。 梳的紋絲不亂的頭發(fā)上渠欺,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音椎眯,去河邊找鬼峻堰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盅视,可吹牛的內(nèi)容都是我干的捐名。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼闹击,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼镶蹋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赏半,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤贺归,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后断箫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拂酣,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年仲义,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婶熬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埃撵,死狀恐怖赵颅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暂刘,我是刑警寧澤饺谬,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站谣拣,受9級(jí)特大地震影響募寨,放射性物質(zhì)發(fā)生泄漏族展。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一拔鹰、第九天 我趴在偏房一處隱蔽的房頂上張望苛谷。 院中可真熱鬧,春花似錦格郁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刻炒,卻和暖如春决采,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坟奥。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工树瞭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爱谁。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓晒喷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親访敌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凉敲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359