我正在构建一个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发布于 2020-11-16 15:54:16
您正在使用CGO_ENABLED=1构建应用程序(这是Go的默认构建设置)--并将该可执行文件移植到没有兼容库支持(glibc、dns解析器等)的停靠映像中。
为了确保构建不依赖于任何外部库(静态绑定所有依赖项),然后可以将其部署到SCRATCH停靠映像或busybox中,在构建阶段禁用CGO:
RUN CGO_ENABLED=0 go build -o goapp .发布于 2020-11-18 04:16:41
我想这两幅图像的libc是有区别的。如在描述中介绍的,有几种libc variants,是通过图像标记来区分的。
golang:1.15.3的libc是glibc (它是FROM对应的debian:buster版本),所以您应该在最后阶段使用busybox:glibc。
默认的busybox:latest是使用uclibc。它们不相容。检查sha256摘要的busybox:latest和busybox:uclibc。
https://stackoverflow.com/questions/64860989
复制相似问题