我现在试图在Kubernetes集群上用shell(/bin/bash)运行一个简单的容器。
我认为有一种方法可以通过使用pseudo-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又重复地启动它。
有没有办法像docker run
命令中的-td
选项那样保持容器在Kubernetes上运行?
你可以在你的 "Dockerfile "中使用这个CMD:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
这将使你的容器保持活力,直到它被告知停止。使用trap和wait将使你的容器对停止请求立即作出反应。如果不使用trap/wait,停止将需要几秒钟。
对于基于busybox的图像(在基于alpine的图像中使用),sleep不知道infinity参数的存在。这个解决方法可以让你对 "docker stop "做出同样的**即时反应,就像上面的例子一样:
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
当一个容器的主进程退出时,它就会退出。做一些类似的事情:
docker run -itd debian
来保持容器的开放,坦率地说是一种黑客行为,只应该用于快速测试和示例。如果你只是想用一个容器进行几分钟的测试,我会这么做:
docker run -d debian sleep 300
这样做的好处是,如果你忘了它,容器会自动退出。另外,你也可以把这样的东西放在一个while
循环中,让它永远运行下去,或者直接运行一个诸如top
之类的应用程序。所有这些在Kubernetes中应该都很容易做到。
真正的问题是你为什么要这样做?你的容器应该提供一个服务,其进程将保持容器在后台运行。