【问题标题】:Start kubernetes container with specific command使用特定命令启动 Kubernetes 容器
【发布时间】:2015-05-12 15:25:28
【问题描述】:

使用fleet,我可以指定在容器启动时在容器内运行的命令。似乎这也应该很容易通过 Kubernetes 实现,但我似乎找不到任何说明如何的东西。似乎您必须专门创建容器才能使用某个命令启动。

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

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

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

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

    在 Cassandra example 中有我想要的提示。图片下方的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
    

    尽管找到了解决方案,但如果 Kubernetes 项目中有明显的地方我可以看到各种配置文件(pod、服务、复制控制器)的所有可能选项,那就太好了.

    【讨论】:

    【解决方案2】:

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

    例如

    command: [ "bin/bash", "-c", "mycommand" ]
    

    也可以

    command:
      - "bin/bash"
      - "-c"
      - "mycommand"
    

    【讨论】:

    • 一行是一个参数。如果你的参数中有空格,那很好,但它不会被解析为多个参数
    • 如果可以使用command 指定所有参数,那么args 的目的是什么?
    • 你可能有一个带有命令的入口点并且只想向它传递参数
    • 我尝试过command: ["npm", "run", "serve"],但效果不佳
    【解决方案3】:

    在上面的 cmets 中回答 Derek Mahar 的问题:

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

    Dockerfiles 可以只有一个入口点或一个 CMD 或两者一起。

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

    ENTRYPOINT ["print"]
    CMD ["hello", "world"]
    

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

        command: ["print"]
    

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

    如果您只指定参数,那么这些参数将被传递给容器入口点中的任何命令。

    【讨论】:

    • 上面有一个错字。应该是ENTRYPOINT
    【解决方案4】:

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

    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"]
    

    【讨论】:

      【解决方案5】:

      除了接受的答案之外,您还可以在命令中使用带有秘密值的变量,如下所示:

      command: ["/some_command","-instances=$(<VARIABLE_NAME>)"]
      env: 
      - name: <VARIABLE_NAME>
        valueFrom:
          secretKeyRef:
            name: <secret_name>
            key: <secret_key>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 2020-01-23
        相关资源
        最近更新 更多