Docker Pod卡在“CrashLoopBackOff”上,即使它应该进入/bin/bash
我正在使用Docker Pod卡在“CrashLoopBackOff”上,即使它应该进入/bin/bash,docker,kubernetes,dockerfile,minikube,Docker,Kubernetes,Dockerfile,Minikube,我正在使用minikube运行Kubernetes集群,我的部署(或单个吊舱)不会保持运行,即使我在Dockerfile中指定它应该保持终端打开(我也尝试了sh)。它们会不断重新启动,有时会在重新启动前陷入一种紧急回退状态: FROM ubuntu EXPOSE 8080 CMD /bin/bash 我的部署文件: apiVersion: apps/v1 kind: Deployment metadata: name: sleeper-deploy spec: replicas:
minikube
运行Kubernetes
集群,我的部署(或单个吊舱)不会保持运行,即使我在Dockerfile
中指定它应该保持终端打开(我也尝试了sh
)。它们会不断重新启动,有时会在重新启动前陷入一种紧急回退
状态:
FROM ubuntu
EXPOSE 8080
CMD /bin/bash
我的部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleeper-deploy
spec:
replicas: 10
selector:
matchLabels:
app: sleeper-world
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: sleeper-world
spec:
containers:
- name: sleeper-pod
image: kubelab
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
总之,我的工作流程如下(deploy.sh
):
#/bin/bash
#清洁
kubectl删除部署--全部
kubectl删除播客--全部
#塑造形象
sudo docker build\
-库贝拉布酒店\
.
#部署
kubectl应用-f轨枕_部署.yml
顺便说一句,我已经使用sudockerrun-dtkubelab对Docker容器进行了单独测试,它确实可以正常工作。为什么它不停留在库伯内特斯(Kubernetes)之内?对于这种特殊情况,我是否应该使用参数(在YAML文件中)或标志?1。原始答案(但已编辑…)
如果您熟悉Docker,请查看
如果您正在寻找与docker run-dt kubelab相当的代码,请尝试kubectl run-it kubelab--restart=Never--image=ubuntu/bin/bash
。在您的情况下,使用Docker-t
标志:。这就是为什么你的Docker容器保持不动
尝试:
kubectl运行kubelab\
--image=ubuntu\
--暴露\
--端口8080\
--/bin/bash-c'为true;睡3600;完成
或:
kubectl运行kubelab\
--image=ubuntu\
--干运行-oyaml\
--暴露\
--端口8080\
--/bin/bash-c'为true;睡3600;完成
2.解释发生了什么(由Philippe Fanaro补充):
正如@David Maze所述,bash
进程将立即退出,因为人工终端将不会有任何东西进入其中,这与Docker的行为略有不同
如果更改restart
策略,它仍将终止,区别在于Pod不会重新生成或重新启动
一种方法是(注意restartPolicy
的选项卡):
但是,如果在部署
YAML中指定,则这将不起作用。这是因为部署强制重新生成,试图始终达到所需的状态。这可以在以下文件中确认:
仅允许使用等于始终
,如果未指定,则为默认值
3.如果您确实希望强制Docker容器继续运行
在这种情况下,您将需要一些不存在的东西。类似服务器的进程就是一个例子。但您也可以尝试以下内容中提到的内容:
这将使您的容器保持活动状态,直到它被告知停止。使用陷阱和等待将使容器立即对停止请求作出反应。如果没有陷阱/等待,停止将需要几秒钟
bash
进程可能会立即退出,因为无法在其中键入任何内容。您应该在容器中运行一些实际的服务器进程。显然,没有办法将其放入YAML部署文件中。在部署中,它甚至指出,在部署中,唯一允许的值是默认值:始终
:>只允许.spec.template.spec.restartPolicy
等于始终
,如果未指定,这是默认值。抱歉,我的错误,请立即检查。抱歉,但是我不明白你再次检查是什么意思。我希望你同意编辑可以改进答案。如果你接受它(或者想出更好的方法),我会接受你的答案。当然我接受了,我想指出的是,第二个命令是获取yaml用于部署,我认为这是获取yaml用于后续版本的最佳方法。您可能也对
apiVersion: v1
kind: Pod
metadata:
name: kubelab-pod
labels:
zone: prod
version: v1
spec:
containers:
- name: kubelab-ctr
image: kubelab
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
restartPolicy: Never
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"