首页 > 解决方案 > 多级 Dockerfile 中的二进制路径错误

问题描述

我试图让我的可执行文件在多级 Dockerfile 中运行时迷失了方向。

我不断得到

"Exec user process caused: no such file or directory unknown"

与我在第一阶段构建的二进制文件的路径相关的错误,所以我知道我引用它是错误的。

谁能看到我哪里出错了?该WORKDIR论点是否也适用于构建的第二阶段?

#####################################
# PHASE 1: build an executable binary
#####################################
FROM golang:alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o server .

#####################################
# PHASE 2: build a small disk image
#####################################
FROM scratch
COPY --from=builder /app/server /app/server
EXPOSE 8000
CMD [ "/app/server" ]

标签: dockergodockerfile

解决方案


当您在没有明确关闭的情况下为同一台机器CGO_ENABLED构建可执行文件时,它会构建动态链接的二进制文件,并且在交叉编译时它会尝试构建静态二进制文件。ldd <executable_path>如果它是动态链接的,您可以通过在构建可执行文件之后使用来确认它是否是动态链接的。

因此,您正在构建一个alpine基础,然后将其复制到scratch没有这些库要动态链接的基础。

因此,首先构建静态二进制文件,然后复制它,它应该运行。看看有CGO_ENABLED=0 go build -o server .没有用。可能还有更多,具体取决于您的代码;所以基本上你必须创建一个静态链接的可执行文件,它应该在无发行版的基础上运行良好。


推荐阅读