[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方式

[root@k8s-master01 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/

 

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

  1. k8s中command、args和dockerfile中的entrypoint、cmd之间的关系

    当用户同时写了command和args的时候自然是可以覆盖DockerFile中ENTRYPOINT的命令行和参数,那么对于具体情况呢,比如仅仅写了command或者args的时候呢?完整的情况分类如 ...

  2. Dockerfile文件中的ENTRYPOINT,CMD命令跟k8s中command,args之间的关系

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

    原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...

  4. vue 父子组件传参

    父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,component ...

  5. Day10--Python--动态传参,作用域

    python的三目运算a = 10b = 20c = a if a > b else b #先判断中间的条件a > b是否成立,成立返回if前面的值,不成立返回else后面的值,也可以 c ...

  6. Vue.js父与子组件之间传参

    父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,component ...

  7. 【vue】父向子组件传参、子组件向父传参

    1.父向子组件传参 App.vue为父,引入componetA组件之后,则可以在App.vue中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与 ...

  8. 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例

    原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例       用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...

  9. python接口测试(post,get)-传参(data和json之间的区别)

    python接口测试如何正确传参: POST 传data:data是python字典格式:传参data=json.dumps(data)是字符串类型传参 #!/usr/bin/env python3 ...

随机推荐

  1. day 06 预科

    目录 if判断 if判断习题 for循环 for循环习题 微信机器人 if判断 # 一条狗朝你过来了,你会干吗? 判断: 如果狗是大长腿牵来的狗--->打招呼:如果是条疯狗,跑. # if:如果 ...

  2. python系列:二、Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 打开我们的浏览器,调 ...

  3. jquery.widget开发(1)

    jquery.widget是挂件,通过挂件模式挂载在jquery对象上,其实本质上也就是用了$.fn.extend和$.extend的扩展. http://blog.sina.com.cn/s/blo ...

  4. C#-将照片存入到SQL SERVER

    将存照片的字段设为image类型. using System; using System.Collections.Generic; using System.ComponentModel; using ...

  5. 基于centos7.6离线部署开k3s

    K3S简介: https://k3s.io/ https://github.com/rancher/k3s https://github.com/rancher/k3s/releases      / ...

  6. 关于struct和typedef struct

    以 struct TelPhone{ ]; ]; }; 为例 这里先定义了一个 TelPhone的结构体. 加入需要为TelPhone定义一个别名: 其语法为 typedef TelPhone TP: ...

  7. Python模块(导入,内置,自定义,开源)

    目录: 模块介绍 自定义模块 内置模块 开源模块 一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用p ...

  8. SSH——ssh_exchange_identification: read: Connection reset by peer

    前言 ssh远程连接出错 步骤 查看ssh的详细信息 [root@pre-nginx02 ~]# ssh -v 192.168.1.164 OpenSSH_6.6.1, OpenSSL 1.0.1e- ...

  9. c#中的new和override的实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; /* 简单说,抽象方法是需要 ...

  10. Evaluation of fast-convergence algorithm for ICA-based blind source separation of real convolutive mixture

    实际卷积混合情况下,基于ICA的盲源分离算法快速收敛性能评估[1]. 提出了一种新的盲源分离算法,该算法将独立分量分析ICA和波束形成BF相结合,通过优化算法来解决盲源分离的低收敛问题.该方法由以下三 ...