docker 无法运行已经存在的 go 输出文件

标签 docker go docker-multi-stage-build

我正在为我的 go 项目构建一个多阶段 Dockerfile。

FROM golang:latest as builder

COPY ./go.mod /app/go.mod
COPY ./go.sum /app/go.sum

#exporting go1.11 module support variable
ENV GO111MODULE=on

WORKDIR /app/

#create vendor directory
RUN go mod download

COPY . /app/

RUN go mod vendor

#building source code
RUN go build -mod=vendor -o main -v ./src/


FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/main /app/main
WORKDIR /app/

ARG port="80"
ENV PORT=$port
EXPOSE $PORT

CMD ["./main"]

当我运行图像时,它抛出错误:

standard_init_linux.go:207: exec user process caused "no such file or directory"

我已验证/app/main 中存在“主”文件。 我还尝试通过添加来授予可执行权限

chmod +x /app/main

但是还是不行。 可能有什么问题?

最佳答案

golang 镜像的“最新”版本是基于 debian 的,它使用 libc。 Alpine 使用 musl。如果您不使用 CGO_ENABLED=0 进行编译,网络库将链接到 libc,并且没有这样的文件或目录错误指向缺少的库。您可以使用 ldd/app/main 检查这些共享库链接。我能想到的几个解决方案:

  • CGO_ENABLED=0编译你的程序
  • 将构建镜像切换到 FROM golang:alpine
  • 将您的第二阶段更改为 FROM debian

关于docker 无法运行已经存在的 go 输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55200508/

相关文章:

golang : Read multiline error response from smtp. 发送邮件

gorm golang one2many 同一张表

docker - Terraform docker 无法使用远程主机的容器注册表进行身份验证

docker - 为什么docker在构建镜像时会创建容器?

java - 具有已知未知主机的多个 Maven 存储库

python - 密码学 Python Docker 多阶段构建

docker - 使用 stretch 和 alpine 进行多阶段构建

macos - M1 mac 无法运行 jboss/keycloak docker 镜像

json - 语言 |解码任意数据

python - Flask 应用程序的 Docker 多阶段构建