我创建了一个永久运行的简单可执行二进制文件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
按照我的解释,这意味着该程序无法执行,并且需要反复重启。 为什么会发生这种情况?
答案 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
。但这不能解释为什么容器失败。