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

[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://k8smeetup.github.io/docs/concepts/cluster-administration/logging/
k8s 传参给docker env command、args和dockerfile中的entrypoint、cmd之间的关系的更多相关文章
- k8s中command、args和dockerfile中的entrypoint、cmd之间的关系
当用户同时写了command和args的时候自然是可以覆盖DockerFile中ENTRYPOINT的命令行和参数,那么对于具体情况呢,比如仅仅写了command或者args的时候呢?完整的情况分类如 ...
- Dockerfile文件中的ENTRYPOINT,CMD命令跟k8s中command,args之间的关系
- WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...
- vue 父子组件传参
父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,component ...
- Day10--Python--动态传参,作用域
python的三目运算a = 10b = 20c = a if a > b else b #先判断中间的条件a > b是否成立,成立返回if前面的值,不成立返回else后面的值,也可以 c ...
- Vue.js父与子组件之间传参
父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,component ...
- 【vue】父向子组件传参、子组件向父传参
1.父向子组件传参 App.vue为父,引入componetA组件之后,则可以在App.vue中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与 ...
- 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例
原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例 用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...
- python接口测试(post,get)-传参(data和json之间的区别)
python接口测试如何正确传参: POST 传data:data是python字典格式:传参data=json.dumps(data)是字符串类型传参 #!/usr/bin/env python3 ...
随机推荐
- day 09 预科
目录 函数 定义函数 函数定义的三种形式 空函数 有参函数(有参数()的函数) 无参函数 函数的返回值 函数的参数 形参 位置形参 实参 位置实参 关键字实参 函数 def twoSum(nums,t ...
- Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块
Hmac模块 其实这个模块类似hashlib模块,它能将一些重要的信息通过算法加密成密文,让信息更具有安全性. 关于hmac加密算法的了解:它的全名是哈希运算消息认证码(Hash-based Mess ...
- thrift接口描述语言 (基于thrift 0.13.0版本)
thrift接口描述语言(IDL)用来定义thrift类型. 一个Thrift IDL文件用来生成各种语言使用的结构体和服务. IDL中包含如下部分: 1. Document Document中包含0 ...
- 自动化运维-ansible入门篇
1.ansible配置 什么是Ansible IT自动化工具 依赖于现有的操作系统凭证来访问控制远程机器 简单易用.安全可靠 Ansible可以完成哪些任务 配置系统 开发软件 编排高级的IT任务 A ...
- Linux crontab命令参数和时间格式说明
crontab 是用来让使用者在固定时间或固定间隔执行程序之用 参数说明 选项 功能 -e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前用户所有的crontab任务 时间格 ...
- DB开发规范---初稿
1 公共约定 1.1 存储引擎 默认统一使用InnoDB引擎 1.2 字符集设定 后续新建DB默认使用utf8mb4字符集,校对规则使用utf8mb4_general_bin. 历史DB多使用utf8 ...
- python测试开发django-rest-framework-64.序列化(serializers.Serializer)
前言 REST framework中的serializers与Django的Form和ModelForm类非常像.我们提供了一个Serializer类,它为你提供了强大的通用方法来控制响应的输出, 以 ...
- NOI2019游记 —— 夏花般绚烂,繁星般璀璨
NOI 2019 游记 夏花般绚烂,繁星般璀璨 打算写成两个形式 Dairy Day -1 早早就到gzez集训了20几天,对整体的环境熟悉很多 在gzez看了场LNR Day 2 然后回到宾馆搞了个 ...
- 51nod 2500 后面第一个大于
小b有一个长度为n的序列t,现在她对于每个i,求最小的正数j满足i+j≤ni+j≤n且ti+j>titi+j>ti,输出j,如果不存在这样的j,则输出0. 样例解释: 对于i=1,t2&g ...
- 08.vue-router动态路由匹配
动态匹配路由的基本用法 思考: <!-有如下3个路由链接.-> <router-link to="/user/1">User1</router-lin ...