为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
吃鸡游戏 2023-06-19 15:22:08
我正在尝试使用 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。完全静态编译的二进制文件的优点是能够从头开始运行,根本不需要任何库。


查看完整回答
反对 回复 2023-06-19
?
慕田峪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


查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信