golang:1.13.1-alpine3.10
fork/exec /var/user/main: no such file or directory
macOS

问题定位

还未来得及定位问题, 用户便反馈说换了一个镜像就没问题了, 于是没能获得更多信息

glibc

啊哈, 终于有线索了, 写代码验证一下

package main

import "fmt"

func main() {
	fmt.Println("hello world")
}
CentOSldd.soreadelf -d
$ ldd main
        not a dynamic executable

程序太简单了, 没有依赖动态库

搜索了一下, 发现 Go 的仓库有一个 issue #33019, 和我们的问题很类似

package main

import (
	"net"
	"fmt"
	"os"
)

func main() {
	ips, err := net.LookupIP("localhost")
	if err != nil {
		fmt.Fprintf(os.Stderr, "Could not get IPs: %v\n", err)
		os.Exit(1)
	}
	for _, ip := range ips {
		fmt.Printf("localhost. IN A %s\n", ip.String())
	}
}
ldd.so
$ ldd main
        linux-vdso.so.1 =>  (0x00007ffca89c9000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6c4b4bd000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f6c4b0f9000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f6c4aef5000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6c4b6d9000)
glibc
golang:1.13.1-alpine3.10
$ docker run -v $PWD:/go/src/test -w /go/src/test golang:1.13.1-alpine3.10 go build -o main-alpine
$ ldd main-alpine
        linux-vdso.so.1 =>  (0x00007ffe0055e000)
        libc.musl-x86_64.so.1 => not found
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f2512754000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f2512390000)
        /lib/ld-musl-x86_64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f2512958000)
libc.musl-x86_64.so.1
$ ./main-alpine
-bash: ./main-alpine: /lib/ld-musl-x86_64.so.1: bad ELF interpreter: No such file or directory
No such file or directory
os/execmain-alpine

解决方案

glibcAlpine Linuxmusl libcgolang:1.13.1-alpine3.10musl libc
golang: