概述
kubernetes中container的command和args主要用于设置运行的命令和参数,它与docker中的entrypoint和cmd有一定的相似之处,但还是有一定的区别。
官方文档可参考https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
如下是Docker 与 Kubernetes中对应的字段名称。
描述 | Dockerfile | Kubernetes |
---|---|---|
容器运行的命令 | Entrypoint | command |
传递给命令的参数 | Cmd | args |
由上表可以看出,k8s的container里的command参数相当于Entrypoint, args参数相当于CMD,command和args可以单独使用,都可以执行一条完成的语句。而如果结合使用args就是作为command的参数传递。
如果要覆盖默认的Entrypoint 与 Cmd,需要遵循如下规则:
如果在Pod资源清单中不提供command或args,则使用Docker镜像中定义的默认值。
如果在Pod资源清单中提供了command但不提供args,则仅使用提供的command。将忽略Docker镜像中定义的EntryPoint和Cmd。
如果仅为Pod资源清单提供args,则Docker镜像中定义默认的Entrypoint与提供的args一起运行。
如果提供了command和args,则Docker镜像中定义的Entrypoint和Cmd将被忽略。直接运行提供的command和args
ENTRYPOINT | CMD | command | args | finally |
---|---|---|---|---|
[“/ep-1”] | [“foo”, “bar”] | ep-1 foo bar | ||
[“/ep-1”] | [“foo”, “bar”] | [“/ep-2”] | ep-2 | |
[“/ep-1”] | [“foo”, “bar”] | [“zoo”, “boo”] | ep-1 zoo boo | |
[“/ep-1”] | [“foo”, “bar”] | [“/ep-2”] | [“zoo”, “boo”] | ep-2 zoo boo |
应用:排查无法正常启动的业务容器
在部署业务时,有时候会遇到业务容器无法正常启动,但由于pod很快就重启了,无法通过kubectl logs查看日志。此时我们可以通过改变容器启动时运行的命令,让容器能够正常运行,进入容器后手动排查问题。具体过程如下:
1、修改部署业务的yml文件并部署
将image部分添加或者修改成如下内容(其他的也可自行测试,能正常运行即可):
command: [“/bin/sh”,“-c”,“sleep 3600”]
然后部署生效。
类似这样的:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: default
labels:
name: myapp
spec:
containers:
- name: test-pod
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c"," sleep 3600"]
2、进入容器,执行原来的业务命令
如jar一般运行的命令为:
java -jar test.jar
正常情况是可以看见错误日志的。通过该方法就不用担心报错后pod立马挂掉看不到输出日志。更多其他的好的方法请各位大佬指点。
业务运行命令的查看方法,要么直接写在上面的yml文件之中,要么是通过Dockerfile编写。前者很容易就可以看到,后者可以通过如下方法查看:
docker histroy image_name:tag(image_id)
查看entrypoint和cmd相关的行,具体怎么组合可以查看entrypoint和cmd的章节后便一目了然。https://blog.csdn.net/margu_168/article/details/131208170
如查看nginx容器的启动命令
[root@k8s-m1 tmp]# docker history nginx:latest --no-trunc |grep -Ei 'cmd|entrypoint'
sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85 18 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon off;"] 0B
<missing> 18 months ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entrypoint.sh"] 0B
<missing> 18 months ago /bin/sh -c #(nop) COPY file:09a214a3e07c919af2fb2d7c749ccbc446b8c10eb217366e5a65640ee9edcc25 in /docker-entrypoint.d
会发现有ENTRYPOINT 和CMD,CMD的内容其实是作为参数传给ENTRYPOINT。文章来源:https://www.toymoban.com/news/detail-755294.html
更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出文章来源地址https://www.toymoban.com/news/detail-755294.html
到了这里,关于【kubernetes系列】kubernetes中的container的command和args的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!