Golang build 填坑笔记
从一个bug说起
bug描述
在尝试用docker的alpine镜像运行从golang镜像中编译出来的可执行文件时出现如下的错误
standard_init_linux.go:211: exec user process caused "no such file or directory"
golang代码如下:
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "hello\n")
}
func main() {
http.HandleFunc("/hello", hello)
http.ListenAndServe("0.0.0.0:8080", nil)
}
Dockerfile文件如下:
FROM golang:1.13 AS builder
WORKDIR /go/src
ADD main.go .
RUN go build -o /go/bin/demo main.go
FROM alpine:3.10
COPY --from=builder /go/bin/demo /app/
CMD ["/app/demo"]
编译镜像
docker build -t demo .
运行容器
docker run -it --rm demo
报上述错误
bug定位
standard_init_linux.go
是从哪里来的?
搜索后发现 opencontainers/runc 项目里有同名的文件,根据项目介绍得知该项目是用于根据 OCI 规范生成和运行容器的命令行工具,而这个bug也是在docker容器中运行出现的,由此推测该错误输出源于这里。
查看 standard_init_linux.go
文件的211行有如下代码
if err := unix.Exec(name, l.config.Args[0:], os.