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
调试结果
- 如果我删除最后一行
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 行)
- 我用
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 个选择:
- 运行 您在 Kubernetes 集群中的映像
- 将你的 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 会将其视为:
- 运行 它在图像环境中
- 运行 入口点,即
/manager
/manager
是用 kubebuilder
构建的,它会尝试加载 kubeconfig
,如果找不到就死掉。
如果你不想在执行docker run
时运行 /manager
,你必须使用--entrypoint
arg.
替换它
Kubebuilder 部分
正如我注意到你提到的,你害怕错过你的 pod 的 kubeconfig,追加这个编辑。
kubebuilder 默认会尝试在 2 个位置查找 kubeconfig:
$HOME/.kube/config
: 文件系统中的配置文件。
- 集群内:kubernetes 中的 pod 运行ning 可以获得集群内的 kubeconfig。
/
我正在尝试 运行 这个 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
调试结果
- 如果我删除最后一行
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 行) - 我用
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 个选择:
- 运行 您在 Kubernetes 集群中的映像
- 将你的 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 会将其视为:
- 运行 它在图像环境中
- 运行 入口点,即
/manager
/manager
是用 kubebuilder
构建的,它会尝试加载 kubeconfig
,如果找不到就死掉。
如果你不想在执行docker run
时运行 /manager
,你必须使用--entrypoint
arg.
Kubebuilder 部分
正如我注意到你提到的,你害怕错过你的 pod 的 kubeconfig,追加这个编辑。
kubebuilder 默认会尝试在 2 个位置查找 kubeconfig:
$HOME/.kube/config
: 文件系统中的配置文件。- 集群内:kubernetes 中的 pod 运行ning 可以获得集群内的 kubeconfig。
/