201

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

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

例如,

$ sudo docker run -td ubuntu:latest

Kubernetes中有这样的选项吗?

我尝试使用以下kubectl run-container命令运行容器:

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

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

-td有没有办法像命令中的选项一样让容器在 Kubernetes 上运行docker run

4

13 回答 13

251

容器旨在运行完成。您需要为您的容器提供永远不会完成的任务。像这样的东西应该工作:

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;" ]
于 2016-10-17T18:35:08.787 回答
167

你可以在你的Dockerfile

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

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

对于基于 busybox 的图像(用于基于 alpine 的图像),sleep 不知道无穷大参数。此解决方法为您提供了对上例中类似的相同的即时响应docker stop

CMD exec /bin/sh -c "trap : TERM INT; sleep 9999999999d & wait"
于 2016-03-03T11:20:36.567 回答
75

容器在其主进程退出时退出。做类似的事情:

docker run -itd debian

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

docker run -d debian sleep 300

这样做的好处是,如果您忘记它,容器将自动退出。或者,您可以将这样的东西放在一个while循环中以使其永远运行,或者只运行一个应用程序,例如top. 所有这些在 Kubernetes 中都应该很容易做到。

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

于 2015-08-07T13:31:24.813 回答
46
  1. 在你的 Dockerfile 中使用这个命令:

    CMD ["sh", "-c", "tail -f /dev/null"]
    
  2. 构建你的 docker 镜像。

  3. 将它推送到您的集群或类似的,只是为了确保它的图像可用。
  4. kubectl run debug-container -it --image=<your-image>
    
于 2016-11-15T08:34:24.007 回答
40

为了让 POD 保持运行,它应该执行某些任务,否则 Kubernetes 会发现它没有必要,因此它会停止。有很多方法可以让 POD 保持运行。

当我需要一个 POD 来连续运行而不做任何有用的操作时,我也遇到过类似的问题。以下是对我有用的两种方式:

  1. 在运行容器时运行 sleep 命令。
  2. 在容器内运行无限循环。

尽管第一个选项比第二个选项更容易并且可能满足要求,但它不是最佳选项。因为,您要在 sleep 命令中分配的秒数是有限制的。但是内部运行无限循环的容器永远不会退出。

但是,我将描述这两种方式(考虑到您正在运行busybox容器):

1. 睡眠命令

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "sleep 1000"]

2.无限循环

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]

运行以下命令来运行 pod:

kubectl apply -f <pod-yaml-file-name>.yaml

希望能帮助到你!

于 2019-04-10T10:52:29.670 回答
30

让 k8s pod manifest 永远运行容器的最简单的命令:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just sleep forever
    command: [ "sleep" ]
    args: [ "infinity" ]
于 2019-02-14T10:47:54.820 回答
14

我能够让它与sleep infinityKubernetes 中的命令一起使用,这将使容器保持打开状态。当这不起作用时,请参阅此答案以获取替代方案。

于 2015-09-21T18:12:06.223 回答
11

我在这个问题上的几分钱。假设这kubectl是有效的,那么与您在问题中提到的 docker 命令等效的最接近的命令将是这样的。

$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity

Pod上面的命令将在命名空间中创建一个单独的命令default,并且它将执行sleep带有infinity参数的命令 - 这样您将拥有一个在前台运行的进程,使容器保持活动状态。

Pod之后,您可以通过运行kubectl exec命令进行交互。

$ kubectl exec ubuntu -it -- bash

这种技术对于创建 Pod 资源和临时调试非常有用。

于 2019-11-09T21:18:04.437 回答
8

在你的 Dockerfile 中使用这个命令来保持容器在你的 K8s 集群中运行:

  • CMD 尾 -f /dev/null
于 2019-07-15T13:58:52.477 回答
3

就我而言,带有 initContainer 的 pod 无法初始化。运行docker ps -a,然后docker logs exited-container-id-here给了我一条kubectl logs podname未显示的日志消息。谜团已揭开 :-)

于 2017-12-04T16:33:28.070 回答
3

有许多不同的方法可以实现这一点,但最优雅的方法之一是:

kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh
于 2019-12-02T12:41:07.850 回答
2

我把它放在后台做了一个hack:

[root@localhost ~]# kubectl run hello -it --image ubuntu -- bash &
[2] 128461

在 pod 上执行hello

[root@localhost ~]# kubectl exec -it hello -- whoami
root
[root@localhost ~]# kubectl exec -it hello -- hostname
hello

得到一个外壳

[root@localhost ~]# kubectl exec -it hello -- bash
root@hello:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
于 2020-11-07T05:27:41.107 回答
1

添加:在模板中->在规范中->在容器中->在端口中和容器端口行之后

    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]
于 2022-03-02T11:28:20.850 回答