docker - 多级 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" ]
解决方案
当您在没有明确关闭的情况下为同一台机器CGO_ENABLED
构建可执行文件时,它会构建动态链接的二进制文件,并且在交叉编译时它会尝试构建静态二进制文件。ldd <executable_path>
如果它是动态链接的,您可以通过在构建可执行文件之后使用来确认它是否是动态链接的。
因此,您正在构建一个alpine
基础,然后将其复制到scratch
没有这些库要动态链接的基础。
因此,首先构建静态二进制文件,然后复制它,它应该运行。看看有CGO_ENABLED=0 go build -o server .
没有用。可能还有更多,具体取决于您的代码;所以基本上你必须创建一个静态链接的可执行文件,它应该在无发行版的基础上运行良好。
推荐阅读
- python - 如何从存储桶中获取所有文件 - IBM Cloud Object Storage?
- c# - Blazor Wasm 将内部对象视为 null,我不知道为什么。(使用 VS 2022/.net core 6)
- java-melody - 如何使用 curl 命令在 javamelody 监控中列出所有添加的应用程序?
- android - 如何在 ionic to andoid 应用程序中正确使用 feGaussianBlur 过滤器?
- postgresql - 如何在postgresql的列中的所有行上应用翻译函数
- docker - 无法将本地目录复制到 Docker 容器中
- graphql - 在 gql 上下文中获取下一个身份验证用户会话时遇到问题
- sql - 表列 - 包含“高度”和“宽度”键/值对的对象列表
- python - z3给出了令人惊讶的答案
- node.js - 在 Node.js 中使用 YAML 变量