go build 打包二進制執行文件與 用 docker 打包 -鏡像 image- 入門

一、go 打包而進駐文件

1、安裝 go 環境

我們可以從官方 https://go.dev/dl
下載對應系統的 go 安裝文件。
我這裏是 mac 系統,x86 架構,所以我選擇了

安裝完成後執行一下 go version 輸出如下:

go version go1.19.7 darwin/amd64

2、新建一個實驗目錄

mkdir hello && cd hello && touch main.go

3、打開 main.go 補充代碼

package main

func main() {
    println("hello world , hi")
}

4、build 打包一個可執行二進制文件 hello

go build -o hello ./main.go

此時我們用 tree 命令查看一下目錄:

➜  hello git:(master) ✗ tree
.
├── hello
└── main.go

0 directories, 2 files

生成了一個 hello 的二進制可執行文件

5、執行一下

➜  hello git:(master) ✗ ./hello                    
hello world , hi

二、本地打包的環境與版本以及各種依賴問題

我們發現,在這裏,我們打包的時候,首先下載了 go 的環境。
如果我們是一個團隊,有很多成員,那麼首先就需要每個人的環境,都得一致,
這樣打包後的文件才能一樣。
如果 go 版本不一致的話,那麼比我的事 1.14,其他熱的 1.19,如果用了新的方法,他在本地發現能用,但同樣的代碼,到我這就不能用了。

三、docker 打包

如果大家都用 docker 打包,在 docker 裏面配置一樣的環境和版本,就可以解決上面的問題。
我們先把 hello 這個文件刪掉,只留下 main.go,如下:

➜  hello git:(master) ✗ tree                       
.
└── main.go

0 directories, 1 file

1、生成 Dockerfile 文件

touch Dockerfile

2、安裝打包 go 的開發環境與版本

一般第一行,我們先構建環境,我們要執行 go 的代碼,那麼第一步需要安裝 go 環境。
通過 FROM 的語法如下:

FROM [--platform=<platform>] <image> [AS <name>]

FROM 指令初始化一個新的構建階段併爲後續指令設置 基本鏡像。因此,有效 Dockerfile 必須以 FROM 指令開始。鏡像可以是任何有效的鏡像——從公共存儲庫中提取鏡像特別容易。
在 Dockerfile 增加如下代碼:

#go環境
FROM golang:1.19

3、把需要執行的文件複製到 docker 內

我們使用 WORKDIR 指令在 docker 內新建一個目錄,
然後再使用 COPY 指令把本地需要執行的代碼,複製到 docker 內。

#go環境
FROM golang:1.19

# 在容器內設置 /hello 爲當前工作目錄
RUN mkdir /hello
WORKDIR /hello
# 把文件複製到當前工作目錄
COPY . .

4、執行 go build 生成二進制打包文件

我們增加一個 RUN 指令來在 docker 中,執行命令
在 Dockerfile 修改代碼變成如下:

#go環境
FROM golang:1.19

# 在容器內設置 /hello 爲當前工作目錄
RUN mkdir /hello
WORKDIR /hello
# 把文件複製到當前工作目錄
COPY . .

#執行go build生成二進制打包文件hello
RUN go build -o hello ./main.go

這樣我們就在 docker 內的 /hello 目錄下,生成了一個 hello 的二進制執行文件。

5、生成對外可供 docker run 執行 命令

如同在本地運行的時候,命名加到環境變量中醫院。
我們這裏使用 ENTRYPOINT 指令

ENTRYPOINT ["executable", "param1", "param2"]   // 這是 exec 模式的寫法,注意需要使用雙引號
#go環境
FROM golang:1.19

# 在容器內設置 /hello 爲當前工作目錄
RUN mkdir /hello
WORKDIR /hello
# 把文件複製到當前工作目錄
COPY . .

#執行go build生成二進制打包文件hello
RUN go build -o hello ./main.go

# docker run 時執行命令
ENTRYPOINT ["./hello"]

之所以是 "./hello" 而非是 "hello" 是因爲,我們是在當前的目錄下的二進制文件。

6、構建 docker 鏡像

如上,我們已經把 Dockerfile 相關的配置好。
在 Dockerfile 同級目錄,執行 docker build 生成鏡像
語法如下:最後的 . 代表本次執行的上下文路徑。

$ docker build -t hello .

這個命名會自動尋找同名目錄下的 Dockerfile 文件,並執行。

此時我們查看一下 docker image 發現已經生成了 一個 hello 鏡像

➜  hello git:(master) ✗ docker image ls | grep hello

輸出:

hello

或者從 docker 客戶端上搜索如下:

7、執行,使用這個鏡像

我們使用 docker run 來執行鏡像

➜  hello git:(master) ✗ docker run hello

輸出:

hello world , hi

8、推送到遠程鏡像存儲

本地執行命令給鏡像打標籤

➜ docker tag hello registry.cn-beijing.aliyuncs.com/hishengg/hello:v1

本地執行命令推送到遠程鏡像

➜ docker push registry.cn-beijing.aliyuncs.com/hishengg/hello:v1

9、到遠程倉庫查看驗證

登入到阿里雲
https://cr.console.aliyun.com...
可以查看到我們剛纔推送的鏡像

點擊鏡像版本,可以查看詳情

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/BFUShEuynV7BbDjGXbLDFg