我现在尝试在Kubernetes集群上使用shell (/bin/bash)运行一个简单的容器。

我认为有一种方法可以通过使用伪tty和detach选项(Docker run命令上的-td选项)来保持容器在Docker容器上运行。

例如,

$ sudo docker run -td ubuntu:latest

Kubernetes中有这样的选项吗?

我尝试使用kubectl run-container命令运行一个容器,如下所示:

kubectl run-container test_container ubuntu:latest --replicas=1

但是容器会退出几秒钟(就像使用没有上面提到的选项的docker run命令启动一样)。ReplicationController会重复启动。

有没有办法让容器在Kubernetes上运行,比如docker run命令中的-td选项?


当前回答

你可以在Dockerfile中使用这个CMD:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

这将使您的容器保持活动状态,直到它被告知停止。使用trap和wait将使容器立即对停止请求做出反应。没有陷阱/等待停止需要几秒钟。

对于基于busybox的图像(用于基于alpine的图像),sleep不知道无穷大参数。这个解决方案给了你和上面例子中一样的对docker stop的即时响应:

CMD exec /bin/sh -c "trap : TERM INT; sleep 9999999999d & wait"

其他回答

容器在主进程退出时退出。做这样的事情:

docker run -itd debian

坦率地说,保持容器打开是一种只能用于快速测试和示例的hack。如果你只是想要一个容器来测试几分钟,我会这样做:

docker run -d debian sleep 300

它的优点是,如果你忘记它,容器将自动退出。或者,您可以在while循环中放入类似的内容以保持它永远运行,或者只运行诸如top之类的应用程序。所有这些在Kubernetes中都很容易做到。

真正的问题是你为什么要这么做?您的容器应该提供一个服务,该服务的进程将使容器在后台运行。

我可以在Kubernetes中的命令睡眠无限中使用它,它将保持容器打开。当这种方法不起作用时,请看下面的答案。

你可以在Dockerfile中使用这个CMD:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

这将使您的容器保持活动状态,直到它被告知停止。使用trap和wait将使容器立即对停止请求做出反应。没有陷阱/等待停止需要几秒钟。

对于基于busybox的图像(用于基于alpine的图像),sleep不知道无穷大参数。这个解决方案给了你和上面例子中一样的对docker stop的即时响应:

CMD exec /bin/sh -c "trap : TERM INT; sleep 9999999999d & wait"

容器意味着运行到完成。您需要为容器提供一个永远不会完成的任务。像这样的东西应该工作:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just spin & wait forever
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]

在Dockerfile中使用以下命令: CMD ["sh", "-c", "tail -f /dev/null"] 构建docker映像。 将它推到您的集群或类似的地方,以确保映像可用。 Kubectl运行debug-container -it——image=<your-image>