问题描述
我正在尝试运行此 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
调试结果
- 如果我删除最后一行
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 行) - 我用
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 中的任何配置以使其运行。
解决方法
简答:
如果您想运行您的映像,只需执行以下操作:
你有两个选择:
- 在 Kubernetes 集群中运行您的映像
- 将您的 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 会将其视为:
- 在镜像环境中运行
- 运行入口点
/manager
/manager
是用 kubebuilder
构建的,它会尝试加载 kubeconfig
,如果找不到东西就会死。
如果不想在执行 /manager
时运行 docker run
,则必须使用 --entrypoint
arg 替换它。
Kubebuilder 部分
正如我注意到您提到您害怕错过 pod 的 kubeconfig,追加此编辑。
kubebuilder 默认会尝试在 2 个地方找到 kubeconfig:
-
$HOME/.kube/config
:文件系统中的配置文件。 - in-cluster:在 kubernetes 中运行的 pod 可以获得集群内 kubeconfig。
/