使用fleet,我可以指定在容器启动时在容器内运行的命令。似乎这也应该很容易通过 Kubernetes 实现,但我似乎找不到任何说明如何。似乎您必须专门创建容器才能使用某个命令启动。
拥有一个通用容器并使用不同的参数启动它比为特定情况创建许多不同的容器或设置和获取环境变量要简单得多。
是否可以指定 kubernetes pod 在启动时在 Docker 映像中运行的命令?
使用fleet,我可以指定在容器启动时在容器内运行的命令。似乎这也应该很容易通过 Kubernetes 实现,但我似乎找不到任何说明如何。似乎您必须专门创建容器才能使用某个命令启动。
拥有一个通用容器并使用不同的参数启动它比为特定情况创建许多不同的容器或设置和获取环境变量要简单得多。
是否可以指定 kubernetes pod 在启动时在 Docker 映像中运行的命令?
我花了 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
尽管找到了解决方案,但如果 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 中的 Entrypoint 值。
如果您只指定参数,那么这些参数将被传递给容器入口点中的任何命令。
为了指定 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"]
除了接受的答案之外,您还可以在命令中使用带有秘密值的变量,如下所示:
command: ["/some_command","-instances=$(<VARIABLE_NAME>)"]
env:
- name: <VARIABLE_NAME>
valueFrom:
secretKeyRef:
name: <secret_name>
key: <secret_key>