使用特定命令启动kubernetes容器

时间:2015-03-11 00:19:53

标签: kubernetes

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

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

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

5 个答案:

答案 0 :(得分:39)

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

在卡桑德拉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,服务,复制控制器),这将是很好的

答案 1 :(得分:29)

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

例如

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

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

答案 2 :(得分:6)

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

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

Dockerfiles只能有一个入口点或者只有一个CMD,或者两者都在一起。

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

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

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

    command: ["print"]

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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