k8s 传参给docker env command、args和dockerfile中的entrypoint、cmd之间的关系

[k8s]args指令案例-彻底理解docker entrypoint

需求:

搞个镜像,可以运行java -jar xxx.jar包,xxx.jar包名称要用参数传

  • 思路1: 打对应运行jar包的jdk的image.
  • 思路2: 打通用jdk

1, 运行指定jar的指定版的jdk

  • k8s运行该image遇到的问题

    • kubectl create -f sms.yaml时报
  rpc error: code = 2 desc = failed to start container "cffbbc3d295f7b5a8d497c8147f7222636b51647387cda491a89d292437c7e47": Error response from daemon: {"message":"invalid header field value \"oci runtime error: container_linux.go:247: starting container process caused \\\"exec: \\\\\\\"/tmp/sms-xx.jar\\\\\\\": permission denied\\\"\\n\""} 
  • 1
  • 等了一会pod奔溃了,报错
  failed to open log file "/var/log/pods/6533426e-aeec-11e7-b1c6-025622f1d9fa/sms-test_3.log": open /var/log/pods/6533426e-aeec-11e7-b1c6-025622f1d9fa/sms-test_3.log: no such file or directory 
  • 1

gg了好一阵,没发现方法解决

  • 这是我的yaml
sms.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sms-test
  labels:
    app: sms-test
spec:
  containers:
  - name: sms-test
    image: sms
    imagePullPolicy: IfNotPresent
    command: ["/tmp/sms-xxx.jar"]
    volumeMounts:
    - mountPath: /tmp
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /tmp

报错问题见上!


  • 但是我这样启镜像是正常的
#vm的tmp下放xxx.jar,挂到容器里
docker run -v /tmp:/tmp -itd sms ‘/tmp/sms-xxx.jar‘
  • 1
  • 2

我一般处理容器化业务思路:

0,物理vm先打通该服务. 1. 打docker镜像.docker run先跑起来. 2.写yaml改造成k8s

  • 我安装思路1定义运行jar包的jdk:的dockerfile
Dockerfile

FROM airdock/base:jessie

RUN mkdir -p /srv/java/
# Add java dynamic memory script
COPY java-dynamic-memory-opts /srv/java/

# Install Oracle JDK 8u25
RUN cd /tmp &&     curl -L -O "http://xxx/jdk-8u25-linux-x64.gz" &&     tar xf jdk-8u25-linux-x64.gz -C /srv/java &&     rm -f jdk-8u25-linux-x64.gz &&     ln -s /srv/java/jdk* /srv/java/jdk &&     ln -s /srv/java/jdk /srv/java/jvm &&     chown -R java:java /srv/java &&     /root/post-install

# Define commonly used JAVA_HOME variable
# Add /srv/java and jdk on PATH variable
ENV JAVA_HOME=/srv/java/jdk     PATH=${PATH}:/srv/java/jdk/bin:/srv/java

COPY docker-entrypoint.sh /bin/

ENTRYPOINT ["docker-entrypoint.sh"]
docker-entrypoint.sh

#!/bin/bash
java -jar $1

嗯哼? 没毛病.

解决k8s运行定制jdk环境的问题:

方法: yaml里command换args指令即可.

sms.yaml

...
spec:
  containers:
  - name: sms-test
    image: sms
    imagePullPolicy: IfNotPresent
    args: ["/tmp/sms-xxx.jar"]
...
docker run -v /tmp:/tmp -itd sms ‘/tmp/sms-xxx.jar‘
                                                         这里args,而非commands
  • 1
  • 2

2, 使jdk环境通用化

想想为了运行一个jar包,定义个运行jar的jdk环境,有点得不偿失.思路:为了通用性,搞个指定版本jdk image,管他运行什么呢.

Dockerfile

FROM airdock/base:jessie

RUN mkdir -p /srv/java/
# Add java dynamic memory script
COPY java-dynamic-memory-opts /srv/java/

# timezone 这里把时区改掉
COPY localtime /etc/localtime
# Install Oracle JDK 8u25
RUN cd /tmp &&     curl -L -O "http://xxx/jdk-8u25-linux-x64.gz" &&     tar xf jdk-8u25-linux-x64.gz -C /srv/java &&     rm -f jdk-8u25-linux-x64.gz &&     ln -s /srv/java/jdk* /srv/java/jdk &&     ln -s /srv/java/jdk /srv/java/jvm &&     chown -R java:java /srv/java &&     /root/post-install

# Define commonly used JAVA_HOME variable
# Add /srv/java and jdk on PATH variable
ENV JAVA_HOME=/srv/java/jdk     PATH=${PATH}:/srv/java/jdk/bin:/srv/java
apiVersion: v1
kind: Pod
metadata:
  name: sms-test
  labels:
    app: sms-test
spec:
  containers:
  - name: sms-test
    image: jdk8u25-ori
    imagePullPolicy: IfNotPresent
    command: ["java","-jar","/tmp/sms-xxx.jar"]
    volumeMounts:
    - mountPath: /tmp
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data

经过观察jar包运行良好.
可见理解k8s yaml指令还是有点必要的.不然天天闲的蛋疼,没事干. 人生最大的敌人是无聊.

彻底理解entrypiont-命令行揉搓挤捏

指定entrypiont

  • 错误的姿势
 docker run -itd -v /tmp/:/tmp/ jdk-ori ‘java -jar /tmp/sms.jar‘
  • 正确的姿势1
 docker run -itd -v /tmp/:/tmp/ jdk-ori java -jar ‘/tmp/sms.jar‘
  • 正确姿势2:
docker run -it -itd -v /tmp/:/tmp/ --entrypoint /srv/java/jdk/bin/java jdk-ori -jar /tmp/sms.jar

 --entrypoint "/srv/java/jdk/bin/java -jar"  这样是不支持的, 这个传参方式不能加参数 ,而dockerfile里则可以
  • 正确姿势3: 挂脚本方式
$ cat /tmp/entry.sh
#!/bin/bash
java -jar $1

docker run -it --rm -v /tmp/:/tmp/ --entrypoint "/tmp/entry.sh" jdk-ori /tmp/sms.jar

也可以指定这些:
https://docs.docker.com/engine/reference/run/#entrypoint-default-command-to-execute-at-runtime

CMD (Default Command or Options)
ENTRYPOINT (Default Command to Execute at Runtime)
EXPOSE (Incoming Ports)
ENV (Environment Variables)
HEALTHCHECK
VOLUME (Shared Filesystems)
USER
WORKDIR

如何在k8s里指定docker run -w 的workdir

思路: 可以通过env方式

[[email protected] ma]# cat centos.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-centos
  labels:
    app: centos
spec:
  containers:
  - name: my-centos
    image: centos:6.8
    imagePullPolicy: IfNotPresent
    command: ["top","-b"]
    env:
      - name: PWD
        value: "/tmp"

一个计时的pod

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args: [/bin/sh, -c,
            ‘i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done‘]

参考: https://www.ibm.com/developerworks/community/blogs/132cfa78-44b0-4376-85d0-d3096cd30d3f/entry/RUN_vs_CMD_vs_ENTRYPOINT_%E6%AF%8F%E5%A4%A95%E5%88%86%E9%92%9F%E7%8E%A9%E8%BD%AC_Docker_%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF_17?lang=en

https://k8smeetup.github.io/docs/concepts/cluster-administration/logging/

原文地址:https://www.cnblogs.com/gaoyuechen/p/11811180.html

时间: 2024-08-25 06:06:25

k8s 传参给docker env command、args和dockerfile中的entrypoint、cmd之间的关系的相关文章

WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=“{Binding}”是行不通的 不能绑父级,但是能绑资源 第一步:定义一个中间类用来做资源对象 1 public class BindingProxy : Freezable 2 { 3 #region Over

vue 父子组件传参

父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与componentA对于它来说是一样的,不好区分,所以使用小写-小写这种写法).而子组件componetA中,声明props参数'msgfromfa'之后,就可以收到父向子组件传的参数了.例子中将msgfromfa显示在<p>标签中.App.vue中 1 1<component-a ms

函数定义,返回值,传参,命名空间,闭包

函数的返回值: return是返回给函数的调用者 函数外面的代码想要获取函数的执行结果,就可以在函数里,用return语句把结果返回. 注意:在函数的执行过程中主要遇到return语句,就会停止执行并返回结果, so可以理解为return语句代表着函数的结束 如果未在函数中指定return,那这个函数的返回值为none 函数的返回值,可以返回一个函数名(可以将嵌套函数里的执行结果return给函数体外,进行执行) return永远且只能返回一个值,,如果返回多各值呢? def func1(nam

python 动态传参,名称空间和作用域,函数的嵌套,global和nonlocal

一.动态传参 1.位置参数动态传参 def func(*args):    *表示动态传参 * 在这里表示接受位置参数的动态传参,接收到的是元组. def fun(*args): print(args) fun('aaa',3,5,6,'ccc') # 结果('aaa', 3, 5, 6, 'ccc') 2.关键字的动态传参 def func(**kwargs): 函数体(代码块) func(n=7,m="aa"): **表示接收关键字参数的动态传参,接收到的是字典. def fun(

8.MVC框架开发(URL路由配置和URL路由传参空值处理)

1.ASP.NET和MVC的路由请求处理 1)ASP.NET的处理 请求---------响应请求(HttpModule)--------处理请求(HttpHandler)--------把请求的资源处理之后返回给客户端 2)MVC的处理 由ASP.NET衍生出来,也遵循请求.响应.处理.资源返回给客户端的过程 请求-----URLRoutingModule(响应路由请求)-----RoutingTable(路由表)(检索请求路径是否和路由表里的路由匹配)-----生成一个路由映射,生成一个Ro

微信小程序的页面跳转==编程式导航传参 和 标签的方法传参

小程序导航传参接收传递过来的参数 在onload中 实例 原文地址:https://www.cnblogs.com/xiaoxiaoxun/p/11414768.html

vue:解决使用param传参后,再次刷新页面会新增一个原有的tab

问题:在最近的项目中,我通过传递不同的参数,复用同一组件进行渲染,然而意外出现一个bug,就是当我重新刷新该页面时,会新增一个tab 原来的: 刷新页面后: 查阅资料后,发现该现象是由于通过params进行传递的参数引起的,params进行传参后再次刷新页面,参数丢失,导致fullpath不一致,从而新增了页面(而我使用的d2admin基于element-ui第三方框架) 解决方案:将params方式传参改为使用query传参,这样参数就不会因为刷新而丢失 参考: https://juejin.

Docker学习总结(1)——Docker实战之入门以及Dockerfile(一)

一.Docker是什么? 首先Docker是软件工业上的集装箱技术 回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题: 在运输过程中,货物损坏 装卸.运输货物,效率低下 运输手续繁多及运输环节多 劳动强度大,及船舶周转慢 在集装箱出现后,完全改变了这种状况,是由于集装箱: 规则标准化,大大减少了包装费用 大大提升了货物装卸效率.及运输效率 不同种运输工具之间转换更容易 所以,集装箱出现是传统行业中的一次重大变革 传统软件行业中存在的问题 软件更新发布低效 业务无法敏捷 环境一致性,难于

Docker CMD ENTRYPOING 和Kubernetes command args对比

Docker CMD ENTRYPOING 和Kubernetes command args对比 exec 模式 使用 exec 模式时,容器中的任务进程就是容器内的 1 号进程 shell 模式 使用 shell 模式时,docker 会以 /bin/sh -c "task command" 的方式执行任务命令.也就是说容器中的 1 号进程不是任务进程而是 bash 进程 CMD 指令 CMD 指令的目的是:为容器提供默认的执行命令. CMD 指令有三种使用方式,其中的一种是为 EN