使用特定命令启动kubernetes容器

sta*_*416 38 kubernetes

使用fleet我可以指定在启动时在容器内运行的命令.看起来Kubernetes也很容易实现这一点,但我似乎无法找到任何说明如何的东西.您似乎必须专门创建容器才能使用某个命令启动.

拥有一个通用容器并使用不同的参数启动它比为特定情况创建许多不同的容器,或设置和获取环境变量简单得多.

是否可以在启动时指定kubernetes pod在Docker镜像中运行的命令?

sta*_*416 40

我花了45分钟寻找这个.然后我发布一个关于它的问题,并在9分钟后找到解决方案.

在Cassandra 示例中有一个我想要的暗示.在command下面的图像行:

id: cassandra
kind: Pod
apiVersion: v1beta1
desiredState:
  manifest:
    version: v1beta1
    id: cassandra
    containers:
      - name: cassandra
        image: kubernetes/cassandra
        command:
          - /run.sh
        cpu: 1000
        ports:
          - name: cql
            containerPort: 9042
          - name: thrift
            containerPort: 9160
        env:
          - key: MAX_HEAP_SIZE
            value: 512M
          - key: HEAP_NEWSIZE
            value: 100M
labels:
  name: cassandra
Run Code Online (Sandbox Code Playgroud)

尽管找到了解决方案,如果在Kubernetes项目中有一些显而易见的地方,我可以看到各种配置文件(pod,服务,复制控制器)的所有可能选项,这将是很好的.

  • AFAIK,目前有两个不错的选择:1)转到你的集群主人的https:// YOUR-IP-HERE/swagger-ui/page.这允许您浏览可用的REST命令及其对象详细信息.2)直接查看代码中的API定义:https://github.com/GoogleCloudPlatform/kubernetes/blob/master/pkg/api/v1beta1/types.go (3认同)
  • 我知道它不准确,但这是一个很好的参考.https://cloud.google.com/compute/docs/containers/container_vms#container_manifest (3认同)
  • 现在,它被称为"名称"而不是"密钥".实际上,kubernetes是一个移动的目标和一个次优的记录. (3认同)
  • @AlexRobinson已更新代码链接,因为v1beta1已被弃用:https://github.com/GoogleCloudPlatform/kubernetes/blob/master/pkg/api/types.go (2认同)

MrE*_*MrE 32

对于那些希望使用带参数的命令的人,您需要提供一个数组

例如

command: [ "bin/bash", "-c", "mycommand" ]
Run Code Online (Sandbox Code Playgroud)

或者也

command:
  - "bin/bash"
  - "-c"
  - "mycommand"
Run Code Online (Sandbox Code Playgroud)

  • 如果可以使用 `command` 指定所有参数,`args` 的目的是什么? (2认同)
  • 您可能有一个带有命令的入口点,并且只想将参数传递给它 (2认同)

Jon*_*han 8

在以上评论中回答德里克·马哈尔的问题:

如果可以使用command指定所有参数,则args的目的是什么?

Dockerfile可以仅具有一个Entrypoint或仅具有CMD,或者两者都可以具有。

如果一起使用,那么CMD中的内容将作为参数传递给ENTRYPOINT中的命令,即

ENTRPOINT ["print"]
CMD ["hello", "world"]
Run Code Online (Sandbox Code Playgroud)

所以在Kubernetes中,当您指定命令即

    command: ["print"]
Run Code Online (Sandbox Code Playgroud)

它将覆盖容器的Dockerfile中Entrypoint的值。

如果仅指定参数,则这些参数将被传递到容器入口点中的任何命令。


小智 6

为了指定 kubernetes pod 在启动时在 Docker 映像中运行的命令,我们需要在 yaml 文件中包含命令和参数字段,以便传递命令和参数。例如,

apiVersion: v1
kind: Pod
metadata:
    name: command-demo
    labels: 
        purpose: demo-command
spec:
    containers:
    - name: command-demo-container
      image: ubuntu
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo hello; sleep 10;done"]
Run Code Online (Sandbox Code Playgroud)