我试图让一个在 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 关注
- 133 浏览
添加回答
举报
0/150
提交
取消