Dockerfile 给 distroless 图像错误

Dockerfile giving error with distroless image

我正在尝试 运行 这个 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/zapr@v0.1.0/zapr.go:128
sigs.k8s.io/controller-runtime/pkg/client/config.GetConfigOrDie
  /go/pkg/mod/sigs.k8s.io/controller-runtime@v0.4.0/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"] 然后 docker run -it image_name 给出错误为:docker: Error response from daemon: No command specified. See 'docker run --help',则保留 distroless 图像。
    同样的 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 行,我能够登录到容器docker run -it image_name.

有人请让我知道如何解决这个问题,这样我就可以用 Dockerfile 中的所有必需配置制作这个 dockerfile 运行。

注意: 恐怕我的 egress-operator pod 可能无法通过更改镜像名称来 运行,因为它可能导致丢失 dockerfile 中的任何配置使其成为 运行.

简答:

如果你想运行你的图片,只需这样做:

你有 2 个选择:

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

如果您正在尝试调试您的图像,试试这个:

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

如果发生 command not found,请将 bash 替换为 sh


说明

Dockerfile 部分

根据 Dockerfile Docs about entrypoint,

An ENTRYPOINT allows you to configure a container that will run as an executable. Command line arguments to docker run <image> will be appended after all elements in an exec form ENTRYPOINT

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

  1. 运行 它在图像环境中
  2. 运行 入口点,即 /manager

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

如果你不想在执行docker run时运行 /manager,你必须使用--entrypoint arg.

替换它

Kubebuilder 部分

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

kubebuilder 默认会尝试在 2 个位置查找 kubeconfig:

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