如何运行使用 go binary 创建的 docker 容器?

inl*_*cro 1 go docker dockerfile

我正在尝试使用 Dockerfile 和 go 文件二进制文件创建一个 docker 容器。

我的文件夹中有两个文件:Dockerfileand main,后者是我的简单 go 文件的二进制文件。

Dockerfile 的内容:

FROM golang:1.11-alpine
WORKDIR /app
COPY main /app/
RUN ["chmod", "+x", "/app/main"]
ENTRYPOINT ["./main"]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下步骤:

  1. 须藤 docker build -t naive5cr 。
  2. 须藤泊坞窗运行 -d -p 8080:8080 naive5cr

我在“docker logs”中看到的错误:

standard_init_linux.go:207: exec 用户进程导致“没有这样的文件或目录”

我的 go 文件内容 [我认为这与问题无关]:

func main() {
    http.HandleFunc("/", index)

    http.ListenAndServe(port(), nil)
}

func port() string {
    port := os.Getenv("PORT")
    if len(port) == 0 {
        port = "8080"
    }
    return ":" + port
 } 
Run Code Online (Sandbox Code Playgroud)

二进制“main”在独立运行时按预期运行。所以go文件的内容没有问题。

BMi*_*tch 6

CGO_ENABLED=0在 Go 中使用网络时,您需要编译以防止链接到 Linux 上的 libc。Alpine 附带 musl 而不是 libc,并试图找到 libc 导致没有此类文件或目录错误。您可以通过运行ldd main查看动态链接来验证这一点。

您还可以在基于 Alpine 的主机上构建以链接到 musl 而不是 libc。完全静态编译的二进制文件的优点是能够从头开始运行,根本不需要任何库。