猿问

Docker golang busybox“没有这样的文件或目录”错误

我正在构建一个 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


湖上湖
浏览 174回答 2
2回答

皈依舞

您正在使用CGO_ENABLED=1(这是 Go 的默认构建设置)构建您的应用程序 - 并将该可执行文件移植到没有兼容库支持(glibc、dns解析器等)的 docker 映像。为了确保您的构建不依赖任何外部库 - 静态绑定所有依赖项 - 然后可以部署到SCRATCHdocker 映像或-在构建阶段busybox禁用:CGORUN CGO_ENABLED=0 go build -o goapp .

慕姐4208626

我猜这两个图像的 libc 之间存在差异。在busybox图片的描述中介绍过,有好几种libc variants,用图片标签来区分。的 libcgolang:1.15.3是 glibc (它是FROM对应的版本debian:buster),所以你应该busybox:glibc在你的最后阶段使用。默认busybox:latest使用uclibc. 它们是不相容的。检查 和 的 sha256busybox:latest摘要busybox:uclibc。
随时随地看视频慕课网APP

相关分类

Go
我要回答