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

如何运行使用go binary创建的docker容器?,docker,go,dockerfile,Docker,Go,Dockerfile,我正在尝试使用Dockerfile和go文件二进制文件创建docker容器 我的文件夹中有两个文件:Dockerfile和main,后者是我的简单go文件的二进制文件 Dockerfile的内容: FROM golang:1.11-alpine WORKDIR /app COPY main /app/ RUN ["chmod", "+x", "/app/main"] ENTRYPOINT ["./main"] 我尝试了以下步骤: sudo docker构建-t naive5cr。 sudo d

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

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

Dockerfile的内容:

FROM golang:1.11-alpine
WORKDIR /app
COPY main /app/
RUN ["chmod", "+x", "/app/main"]
ENTRYPOINT ["./main"]
我尝试了以下步骤:

sudo docker构建-t naive5cr。 sudo docker run-d-p 8080:80805CR 我在docker日志中看到的错误:

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
 } 

二进制主程序在独立运行时按预期运行。因此go文件的内容没有问题。

go编译为本机代码,因此确保在Docker映像上构建go代码,而不是将二进制文件复制到Docker映像

e、 g

还有一个额外的好处,就是如何使用多级Docker构建创建真正微小的Docker图像:

FROM golang:1.11-alpine AS build-env
ADD . /src
RUN cd /src && go build -o goapp

FROM alpine
WORKDIR /app
COPY --from=build-env /src/goapp /app/
ENTRYPOINT ./goapp

go编译为本机代码,因此请确保在Docker映像上构建go代码,而不是将二进制文件复制到Docker映像

e、 g

还有一个额外的好处,就是如何使用多级Docker构建创建真正微小的Docker图像:

FROM golang:1.11-alpine AS build-env
ADD . /src
RUN cd /src && go build -o goapp

FROM alpine
WORKDIR /app
COPY --from=build-env /src/goapp /app/
ENTRYPOINT ./goapp
您需要使用CGO_ENABLED=0进行编译,以防止在Go中使用网络时链接到Linux上的libc。Alpine附带musl而不是libc,尝试查找libc会导致无此类文件或目录错误。您可以通过运行ldd main查看动态链接来验证这一点

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

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


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

可能重复:可能重复:我使用CGO_ENABLED=0 go build构建go文件,然后它就工作了。是否有任何命令用于详细输出我得到的错误?standard_init_linux.go:207:exec用户进程未导致此类文件或错误directory@inlineMacro这个错误来自内核/系统调用,docker只是在传递它。如果您的主机上缺少库,您在docker之外也会遇到同样的错误。我使用CGO_ENABLED=0 go build构建了go文件,然后它就工作了。是否有任何命令用于详细输出我得到的错误?standard_init_linux.go:207:exec用户进程未导致此类文件或错误directory@inlineMacro这个错误来自内核/系统调用,docker只是在传递它。如果主机上缺少库,那么在docker之外也会出现同样的错误。