Distroless 镜像有 3 个用户:
> docker run --rm --entrypoint cat gcr.io/distroless/nodejs:debug /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/sbin/nologin
nonroot:x:65532:65532:nonroot:/home/nonroot:/sbin/nologin
Run Code Online (Sandbox Code Playgroud)
USER如果您在Dockerfile中没有说明的情况下运行映像,则映像将以uid=0(root) gid=0(root)运行。
我想避免这种情况并使用非特权用户。
除了没有人没有目录之外,在我的 Dockerfile 中使用和/home之间有什么区别?USER nobodyUSER nonroot
我试图获得一个在 docker 容器内运行的最小示例 go 应用程序。exec /app: no such file or directory但我在运行容器时不断出现。
我检查并仔细检查了构建和复制应用程序数据的图像中的所有路径,甚至使用交互式 shell 查看容器内部以验证我的路径app是否存在,但没有任何效果。
我的 Dockerfile:
# syntax=docker/dockerfile:1
# BUILD-STAGE
FROM golang:1.17-alpine as build
WORKDIR /go/app
COPY . .
RUN go mod download
RUN go build -o /go/bin/app
# RUN-STAGE
FROM gcr.io/distroless/static-debian11
COPY --from=build /go/bin/app .
EXPOSE 8080
CMD ["./app"]
Run Code Online (Sandbox Code Playgroud)
经过几个小时的尝试和错误,我终于尝试添加CGO_ENABLED=0到我的 go build 命令中......并且它起作用了!
我现在的问题是......到底为什么会发生这种情况?当我在隐式启用 CGO 的情况下构建图像时没有出现错误,我什至验证了二进制文件已复制到我的第二阶段!为什么使用CGO构建时运行时说没有这个文件,但禁用CGO构建时可以很容易找到它?