首先是錯(cuò)誤代碼:
standard_init_linux.go:228: exec user process caused: no such file or directory
打包的鏡像并不復(fù)雜,采用的是alpine鏡像作為底包,將在Ubuntu下編譯好的go程序COPY進(jìn)入鏡像,然后執(zhí)行程序。
go程序使用了Gin,requests等庫
將程序打包好后使用docker run 報(bào)錯(cuò)且鏡像直接退出即使加上-it等參數(shù)依然無法進(jìn)入鏡像。
解決方法:
經(jīng)過查閱資料后得知,golang在編譯時(shí)可以選擇使用C鏈接庫(引用的C鏈接庫不打包進(jìn)程序)或者純Go編譯(打包所有用到的內(nèi)容)
而我使用的Go版本恰好又是默認(rèn)使用C鏈接庫也就是CGO方式編譯的

在容器的底包alpine鏡像中沒有g(shù)o程序依賴的C鏈接庫,所以會(huì)報(bào)錯(cuò)找不到文件。
因此,只需要將CGO模式關(guān)掉讓程序能夠脫離環(huán)境獨(dú)立運(yùn)行即可。
有教程說在go build 時(shí)加上-tags netgo即可,不過我試了下不知道為什么沒效果。
所以直接采用設(shè)置env的方式
go env -w CGO_ENABLED=0
設(shè)置好環(huán)境變量后重新編譯打包docker鏡像即可。
參考的大佬文章:
Golang build筆記standard_init_linux.go:211: exec user process caused no such file or directory