使用Docker編譯構(gòu)建go工程鏡像【新手版】

注:因為是第一次跟著教程做的邮旷。應(yīng)該還有優(yōu)化的空間,可能還會有比較蠢的代碼片段知纷。

Dockerfile分為兩段:

  • 第一段,構(gòu)建一個臨時的build用的鏡像陵霉,用來編譯生成go的運(yùn)行文件琅轧。
  • 第二段,構(gòu)建一個純凈版空鏡像scratch作為運(yùn)行鏡像撩匕,把編譯好的運(yùn)行文件和相關(guān)需要的配置文件什么的一起COPY到新的運(yùn)行鏡像里鹰晨。這樣運(yùn)行鏡像就可以非常小墨叛。如果為了調(diào)試方便止毕,還是建議用alpine鏡像。

PS漠趁,雖然我看到的教程里是可以用scratch來運(yùn)行g(shù)o編譯后的運(yùn)行文件扁凛。但是我沒成功,最后還是用了alpine鏡像闯传。

Go工程結(jié)構(gòu)

因為是練習(xí)谨朝,所以構(gòu)建了一個相對簡單的工程


image.png

打包思路

拋開docker,先梳理一下整個go工程的打包步驟:

  1. 編譯工程需要有g(shù)o 1.16的運(yùn)行環(huán)境
  2. 由于使用了go mod甥绿,需要設(shè)置GOPROXY=https://goproxy.io,direct
  3. 工程啟動文件是main.go字币,我習(xí)慣把工程編譯到一個新的work文件夾里,運(yùn)行文件起名server共缕。所以編譯命令是
go build -o work/server main.go
  1. 編譯后的運(yùn)行方式是
cd work
./server

第一段:編譯鏡像

  1. 使用go的官方基礎(chǔ)鏡像包洗出,alpine版本。
FROM golang:1.16-alpine AS build

go mod我使用的是1.16的版本图谷,對應(yīng)的golang鏡像也用對應(yīng)版本翩活。
注意這里用的是FROM ... AS ... (這個build要記住阱洪,后面要考)

  1. 定義工作目錄是/project,并且把相關(guān)編譯腳本拷貝到鏡像的/project目錄下
WORKDIR /project/
COPY ./project /project
  1. 運(yùn)行編譯命令菠镇,生成運(yùn)行文件
RUN go env -w GOPROXY=https://goproxy.io,direct
RUN go build -o /project/work/server main.go

第二段:運(yùn)行鏡像

  1. 運(yùn)行鏡像使用alpine作為基礎(chǔ)鏡像
FROM alpine
  1. 配置一些基礎(chǔ)設(shè)置,比如說時區(qū)
ENV TZ Asia/Shanghai
  1. 從編譯鏡像將運(yùn)行需要的工程文件拷貝過來
COPY --from=build /project/work/ /work/

注:這里的build就是之前那個FROM ... AS build

  1. 配置工作目錄和運(yùn)行相關(guān)
# 定義工作目錄為work
WORKDIR /work
# 開放http 80端口
EXPOSE 80
# 啟動http服務(wù)
ENTRYPOINT ["./server"]       

完整的Dockerfile

# 編譯鏡像
FROM golang:1.16-alpine AS build

WORKDIR /project/
COPY ./project /project
RUN go env -w GOPROXY=https://goproxy.io,direct
RUN go build -o /project/work/server main.go

# 運(yùn)行鏡像
FROM alpine
ENV TZ Asia/Shanghai
COPY --from=build /project/work/ /work/

# 定義工作目錄為work
WORKDIR /work
# 開放http 80端口
EXPOSE 80
# 啟動http服務(wù)
ENTRYPOINT ["./server"]

構(gòu)建并推送鏡像

# 在Dockerfile所在文件夾運(yùn)行
docker build -t xxxx/xxxx:v1 .

# 構(gòu)建成功后,運(yùn)行測試一下
docker run -d xxxx/xxxx:v1

# docker ps查看一下運(yùn)行情況
docker ps

# 查看一下容器對應(yīng)的pid
docker inspect 554c4578242e|grep -i pid

# 查看對應(yīng)的IP配置
nsenter -t 256418 -n ip a
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侄旬,一起剝皮案震驚了整個濱河市算途,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隘梨,老刑警劉巖魂毁,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異出嘹,居然都是意外死亡席楚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門税稼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烦秩,“玉大人,你說我怎么就攤上這事郎仆≈混簦” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵扰肌,是天一觀的道長抛寝。 經(jīng)常有香客問我,道長曙旭,這世上最難降的妖魔是什么盗舰? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮桂躏,結(jié)果婚禮上钻趋,老公的妹妹穿的比我還像新娘。我一直安慰自己剂习,他們只是感情好蛮位,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳞绕,像睡著了一般失仁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上们何,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天萄焦,我揣著相機(jī)與錄音,去河邊找鬼垂蜗。 笑死楷扬,一個胖子當(dāng)著我的面吹牛解幽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烘苹,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼躲株,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镣衡?” 一聲冷哼從身側(cè)響起霜定,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廊鸥,沒想到半個月后望浩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惰说,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年磨德,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吆视。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡典挑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啦吧,到底是詐尸還是另有隱情您觉,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布授滓,位于F島的核電站琳水,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏般堆。R本人自食惡果不足惜在孝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望郁妈。 院中可真熱鬧浑玛,春花似錦绍申、人聲如沸噩咪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胃碾。三九已至,卻和暖如春筋搏,著一層夾襖步出監(jiān)牢的瞬間仆百,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工奔脐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俄周,地道東北人吁讨。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像峦朗,于是被迫代替她去往敵國和親建丧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容