Dockerfile 使用 distroless 图像出错 Dockerfile 部分Kubebuilder 部分

问题描述

我正在尝试运行此 Dockerfile with distroless image (gcr.io/distroless/static:nonroot)。 docker build 成功发生,但 docker run -it image_name 给我错误

2021-07-13T18:16:11.441Z   ERROR   controller-runtime.client.config  unable to get kubeconfig    {"error": "Could not locate a kubeconfig"}
github.com/go-logr/zapr.(*zapLogger).Error
  /go/pkg/mod/github.com/go-logr/[email protected]/zapr.go:128
sigs.k8s.io/controller-runtime/pkg/client/config.GetConfigOrDie
  /go/pkg/mod/sigs.k8s.io/[email protected]/pkg/client/config/config.go:146
main.main
  /workspace/main.go:63
runtime.main
  /usr/local/go/src/runtime/proc.go:203

调试结果

  1. 如果我删除最后一行 ENTRYPOINT ["/manager"] 则保留 distroless 图像,然后 docker run -it image_name 给出错误为-:docker: Error response from daemon: No command specified. See 'docker run --help'
    同样的 docker run 命令适用于 distroless(带 ENTRYPOINT 行)但不适用于 distroless(不带 ENTRYPOINT 行)
  2. 我用 alpine:latest 替换了 distroless 图像。这里有 ENTRYPOINT ["/manager"](没有 USER nonroot:nonroot)我看到与上面相同的错误 ERROR controller-runtime.client.config unable to get kubeconfig... BUT 没有 ENTRYPOINT 行,我可以用 {{ 登录到容器1}}。

有人请告诉我如何解决这个问题,以便我可以使这个 dockerfile 使用所有必需的配置运行,就像在 Dockerfile 中一样。

注意:我担心我的 egress-operator pod 可能无法通过更改映像名称来运行,因为它可能会导致丢失 dockerfile 中的任何配置以使其运行。

解决方法

简答:

如果您想运行您的映像,只需执行以下操作:

你有两个选择:

  1. 在 Kubernetes 集群中运行您的映像
  2. 将您的 kubeconfig 作为 $HOME/.kube/config

如果您正在尝试调试图像,请尝试以下操作:

docker run --rm -it --entrypoint bash image_name

如果 bash 发生,用 sh 替换 command not found


说明

Dockerfile 部分

根据Dockerfile Docs about entrypoint

ENTRYPOINT 允许您配置将作为可执行文件运行的容器。 docker run <image> 的命令行参数将附加在 exec 形式的所有元素之后 ENTRYPOINT

您的命令是 docker run -it image_name 没有任何参数,因此 docker 会将其视为:

  1. 在镜像环境中运行
  2. 运行入口点 /manager

/manager 是用 kubebuilder 构建的,它会尝试加载 kubeconfig,如果找不到东西就会死。

如果不想在执行 /manager 时运行 docker run,则必须使用 --entrypoint arg 替换它。

Kubebuilder 部分

正如我注意到您提到您害怕错过 pod 的 kubeconfig,追加此编辑。

kubebuilder 默认会尝试在 2 个地方找到 kubeconfig:

  1. $HOME/.kube/config:文件系统中的配置文件。
  2. in-cluster:在 kubernetes 中运行的 pod 可以获得集群内 kubeconfig。 /