建立最小的Go Docker映象

2021-09-11 20:38:20 字數 1903 閱讀 3304

首先讓我們建立乙個很簡單的go程式:

package main

import "fmt"

func main()

執行下面的命令會建立乙個超小的映象, 這是我們的第一種方式:

下一節介紹其中的編譯引數

檢視映象, 生成的映象只有1.21mb

repository tag image id created size

這命令將編譯、打包、輸入映象整合到一條命令了。

第二種方式是使用乙個dockerfile檔案:

from scratch
執行下面的命令建立乙個映象:

檢視生成的映象, 也是1.21mb:

repository tag image id created size

第三種方式是利用docker的 multistage 功能,在映象中編譯,dockerfile檔案:

# dockerfile.multistage
檢視生成的映象, 也是``:

repository tag image id created size

你可以結合你的情況選擇一種生成映象的方式。

上面的例子中我們使用下面的命令編譯go程式:

自go 1.10以後,你不必再使用installsuffix引數(或許更早的版本),go的核心開發人員ian lance taylor已經確認了這一點。

你可能有人還使用-a引數,它強制重新編譯相關的包,一般你不會使用它。

-s忽略符號表和除錯資訊,-w忽略dwarf符號表,通過這兩個引數,可以進一步減少編譯的程式的尺寸,更多的引數可以參考go link, 或者go tool link -help(另乙個有用的命令是go tool compile -help)。

你也可以使用strip工具對編譯的go程式進行裁剪。

本身go是靜態編譯的, 對於cgo, 如果設定cgo_enabled=0,則完全靜態編譯,不會再依賴動態庫。

預設情況下net包會使用靜態鏈結庫, 比如libc

知道了原因,解決辦法也很簡單,就是完全靜態鏈結或者在基礎映象中加入libc庫。

下面是幾種解決辦法:

有的同學說了,我**中確實必須使用cgo,因為需要依賴一些c/c++的庫。目前沒有對應的go庫可替代, 那麼可以使用-extldflags "-static",go tool link help介紹了extldflags的功能:

-extldflags flags

set space-separated flags to pass to the external linker.

-static means do not link against shared libraries

其實前面已經列出了一些常用的基礎映象:

顯然。 你應該只在編譯階段使用go的映象,這樣才能將你的映象減小到最小。

docker映象的建立

自己建立映象 docker search 映象名 eg.docker search centos可以看到映象名 作者資訊 是否為官方 建立時間 大小等資訊 docker pull 映象名 標籤名 eg.docker pull centos latestfrom 作為基礎的映象名 maintainer...

dockerfile建立映象

dockerfile用來快速建立自定義映象 dockerfile分為部分 基礎映象資訊,維護者資訊,映象操作指令,容器啟動時執行指令 一開始必須指明所基於的映象名稱 維護者資訊 映象操作指令 run 執行容器時的操作命令 cmd from 功能為指定基礎映象,並且必須是第一條指令。如果不以任何映象為...

Docker映象建立

2 建立步驟 2 執行容器。3 修改容器。4 將容器儲存為新的映象。開啟乙個新的xshell視窗 docker pull options name tag digest docker images options repository tag docker run options image com...