我正在尝试在cmd行上运行的golang程序在docker容器中运行,但是导入存档/ 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/amd64 Docker version 18.09.1, build 4c52b90 ubuntu 18.04LTS
我将不胜感激。
由毗湿奴·纳拉亚南解决:
我用过
`CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo test.go`
构建一个静态可执行文件,并且可以正常工作。
答案 0 :(得分:2)
为什么?
这是由于默认的go build
行为。由于动态链接,编译后的二进制文件仍在系统路径中寻找库。
由于scratch
为空,因此二进制文件无法找到系统库并引发错误。
如何解决此问题?
修改构建脚本以生成包含所有内置库的静态编译构建。
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
将上述构建的输出二进制文件用于docker容器。