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"