【问题标题】:Docker golang busybox "no such file or directory" errorDocker golang busybox“没有这样的文件或目录”错误
【发布时间】:2020-11-16 15:38:35
【问题描述】:

我正在构建一个 golang 微服务的多级 Docker 映像,我想使用busybox 作为基础映像使其非常精简,以运行最终的可执行文件。 图像已正确构建,但是当我运行它时出现此错误:

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

我正在使用我的 Ubuntu 笔记本电脑,因此正如许多其他问题所报告的那样,此错误与 Windows 操作系统无关。

这是我的照片。

# build stage
FROM golang:1.15.3 AS build-stage

RUN mkdir /build
ADD . /build/
WORKDIR /build

RUN go mod download
RUN go test ./...
RUN go build -o goapp .

# final stage
FROM busybox
WORKDIR /app
COPY --from=build-stage /build/goapp /app/

CMD ["./goapp"]

我的项目文件夹的一个非常简化的版本可能是:

project
├── Dockerfile
├── go.mod
├── go.sum
├── main.go
└── other-packages

【问题讨论】:

  • 完成但得到完全相同的错误

标签: docker go dockerfile busybox docker-multi-stage-build


【解决方案1】:

您正在使用 CGO_ENABLED=1(这是 Go 的默认构建设置)构建您的应用程序 - 并将该可执行文件移植到没有兼容库支持的 docker 映像(glibcdns 解析器等)。

为确保您的构建不依赖任何外部库 - 静态绑定所有依赖项 - 然后可以部署到 SCRATCH docker 映像或 busybox - 在构建阶段禁用 CGO

RUN CGO_ENABLED=0 go build -o goapp .

【讨论】:

  • 应用您的更改后,我得到:复制失败:stat /var/lib/docker/overlay2/c989081c12b1f7b2a976bbf0a6848d48a929550d104b5ca6238758b5651394bc/merged/goapp: no such file or directory
  • COPY 看起来是正确的。也许你的docker 缓存出了点问题。尝试将--no-cache 添加到您的docker build 命令中。
【解决方案2】:

我猜这两个图像的 libc 之间存在差异。 正如busybox图片的description中介绍的,libc variants有几个,通过图片标签来区分。

golang:1.15.3的libc是glibc(FROM对应debian:buster的版本),所以你应该在最后阶段使用busybox:glibc

默认busybox:latest 使用uclibc。它们是不相容的。检查busybox:latestbusybox:uclibc 的sha256 摘要。

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2018-02-09
    • 2019-01-19
    • 2020-04-18
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多