我正在尝试使用 Dockerfile 和 go file 二进制文件创建一个 docker 容器。我的文件夹中有两个文件:Dockerfile和main,其中后者是我的简单 go 文件的二进制文件。Dockerfile 的内容:FROM golang:1.11-alpineWORKDIR /appCOPY main /app/RUN ["chmod", "+x", "/app/main"]ENTRYPOINT ["./main"]我尝试了以下步骤:sudo docker build -t naive5cr 。sudo docker run -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 } 二进制“main”在独立运行时按预期运行。所以go文件的内容是没有问题的。
2 回答
胡说叔叔
TA贡献1804条经验 获得超8个赞
CGO_ENABLED=0
当在 Go 中使用网络时,您需要编译以防止在 Linux 上链接到 libc。Alpine 附带 musl 而不是 libc,并且尝试查找 libc 会导致没有这样的文件或目录错误。您可以通过运行ldd main
查看动态链接来验证这一点。
您还可以在基于 Alpine 的主机上构建以链接到 musl 而不是 libc。完全静态编译的二进制文件的优点是能够从头开始运行,根本不需要任何库。
慕田峪9158850
TA贡献1794条经验 获得超7个赞
go 编译为本机代码,因此请确保在 Docker 映像上构建您的 go 代码,而不是将二进制文件复制到 docker 映像。
例如
FROM golang:1.11-alpine
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
ENTRYPOINT ./goapp
另外作为奖励,这里是如何使用多阶段 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
- 2 回答
- 0 关注
- 115 浏览
添加回答
举报
0/150
提交
取消