使用特定命令启动 kubernetes 容器

Start kubernetes container with specific command

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

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

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

我花了 45 分钟找这个。然后我 post 提出了一个问题,并在 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,服务,复制控制器)。

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

例如

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

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

回答上面评论中 Derek Mahar 的问题:

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

Dockerfile 可以只有一个入口点或只有一个 CMD 或两者都有。

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

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

所以在 Kubernetes 中,当你指定一个命令时,即

    command: ["print"]

它将覆盖容器 Dockerfile 中入口点的值。

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

为了指定 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"]

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

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