在k8s的资源对象pod中,经常会使用command和args。那么command指令指定的命令和args指定的参数会不会和镜像构建时Dockerfile文件中的ENTRYPOINT冲突呢?答案是不会。
ENTRYPOINT指定的命令当使用docker来运行镜像时,是不能被覆盖的,但是在k8s中,当pod定义中同时配置command和args时会被覆盖。
使用测试镜像验证下,Dockerfile文件如下:
FROM alpine:3.10
ENTRYPOINT ["echo", "hello world"]
docker运行镜像时,指定命令“ip a”,

从上面的输出看,Dockerfile中ENTRYPOINT指定的命令echo没有被覆盖,运行时指定的命令“ip a”被当成echo命令的参数。还是上面的镜像将其运行在k8s中,看下效果如何?pod的定义如下,
apiVersion: v1
kind: Pod
metadata:
name: alpine-echo
namespace: test
spec:
nodeSelector:
kubernetes.io/hostname: 10.0.1.9
containers:
- name: alpine-echo
image: alpine-echo:v1
command: ["ip"]
args: ["a"]
运行后,查看pod的日志,

pod中指定的command和args生效了,日志输出了pod的IP地址信息。
总结如下:
- 如果command和args没有配置,则使用Dockerfile中的启动配置
- 如果仅配置command,则忽略Dockerfile中的配置,执行command的配置
- 如果仅配置args,那么Dockerfile中的ENTRYPOINT会被执行,使用args配置作为参数
- 如果command和args都有配置,则Dockerfile中ENTRYPOINT的配置被忽略
758

被折叠的 条评论
为什么被折叠?



