为什么kubernetes pod无法运行docker镜像

时间:2020-02-05 13:47:49

标签: docker kubernetes

我创建了一个永久运行的简单可执行二进制文件program

// pseudocode
while (true) {
    print("Sleeping")
    sleep(seconds(1));
}

然后我使用Dockerfile这样的程序来实现此程序的使用:

FROM debian:10
ADD program /
ENTRYPOINT ["/program"]

然后,我将docker镜像构建并推送到全局存储库:

docker build -t docker:5000/program .
docker push docker:5000/program

然后,我为此程序创建一个deploy.yaml文件,以便在kubernetes容器上运行:

apiVersion: v1
kind: Pod
metadata:
 name: program
 namespace: my_namespace
spec:
 containers:
  - name: program
    image: docker:5000/program
    imagePullPolicy: Always
    command: ["echo", "SUCCESS"]

最后,我在kubernetes上启动程序:

kubectl create -f deploy.yaml

但是,kubectl describe pods -n my_namespace program报告:

Events:
  Type     Reason     Age                 From                         Message
  ----     ------     ----                ----                         -------
  Normal   Scheduled  27m                 default-scheduler            Successfully assigned 
mariusl/ingress to mma7-standard5-ime
  Normal   Created    26m (x4 over 27m)   kubelet, mma7-standard5-ime  Created container 
ingress
  Normal   Started    26m (x4 over 27m)   kubelet, mma7-standard5-ime  Started container 
ingress
  Normal   Pulling    25m (x5 over 27m)   kubelet, mma7-standard5-ime  Pulling image 
"docker:5000/program"
  Normal   Pulled     25m (x5 over 27m)   kubelet, mma7-standard5-ime  Successfully pulled 
image "docker:5000/program"
  Warning  BackOff    2m (x117 over 27m)  kubelet, mma7-standard5-ime  Back-off restarting 
failed container

按照我的解释,这意味着该程序无法执行,并且需要反复重启。 为什么会发生这种情况?

3 个答案:

答案 0 :(得分:2)

您的Pod配置了command: ["echo", "SUCCESS"],它将覆盖ENTRYPOINT ["/program"],因此,您的容器将仅echo SUCCESS并立即终止。

请注意,在Kubernetes中,command将覆盖Docker容器中的entrypoint,而args将覆盖Docker容器中的cmd

您可以删除command: ["echo", "SUCCESS"]行,然后pod就会启动并运行!

答案 1 :(得分:1)

当您覆盖默认的Entrypoint和Cmd时,将应用以下规则:read here

1)如果不为Container提供命令或args,则使用Docker映像中定义的默认值。

2)如果您提供命令但没有为容器提供参数,则仅使用提供的命令。 Docker映像中定义的默认EntryPoint和默认Cmd将被忽略。

3)如果仅为容器提供args,则Docker映像中定义的默认Entrypoint将使用您提供的args运行。

4)如果提供命令和参数,则将忽略Docker映像中定义的默认Entrypoint和默认Cmd。您的命令与args一起运行。

答案 2 :(得分:0)

您的容器执行回显“ SUCCESS”并终止,请参见 https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes

kubernetes中的

command会覆盖docker中的entrypoint。但这不能解释为什么容器失败。