我試圖讓一個在 cmd 行上運行的 golang 程序在 docker 容器中運行,但是導入 archive/tar 會導致錯誤。這有效: package main import ( "fmt" ) func main() { fmt.Println("success!") }產生輸出: liam gotest $ docker run -it gotest success!這不會: package main import ( "archive/tar" "fmt" ) var _ = tar.TypeReg func main() { fmt.Println("success!") }產生輸出: liam gotest $ docker run -it gotest standard_init_linux.go:207: exec user process caused "no such file or directory"這是我的 Dockerfile: FROM scratch WORKDIR /app COPY . /app CMD ["./test"]我在跑:go version go1.11.4 linux/amd64Docker version 18.09.1, build 4c52b90ubuntu 18.04LTS我將不勝感激任何建議。由 vishnu narayanan 解決:我用了`CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo test.go`構建一個靜態可執行文件,它成功了。
1 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
為什么 ?
這是因為默認go build
行為。由于動態鏈接,編譯后的二進制文件仍在系統路徑中尋找庫。
由于scratch
是空的,二進制文件無法找到系統庫并拋出錯誤。
如何解決這個問題?
修改構建腳本以生成包含所有內置庫的靜態編譯構建。
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
將上述構建的輸出二進制文件用于 docker 容器。
- 1 回答
- 0 關注
- 173 瀏覽
添加回答
舉報
0/150
提交
取消