[k8s]args指令案例-彻底理解docker entrypoint
来源:互联网 发布:淘宝收购饿了么 编辑:程序博客网 时间:2024/06/08 10:54
需求:
搞个镜像,可以运行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\""}
- 等了一会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
gg了好一阵,没发现方法解决
- 这是我的yaml
sms.yamlapiVersion: v1kind: Podmetadata: name: sms-test labels: app: sms-testspec: 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'
我一般处理容器化业务思路:
0,物理vm先打通该服务. 1. 打docker镜像.docker run先跑起来. 2.写yaml改造成k8s
- 我安装思路1定义运行jar包的jdk:的dockerfile
DockerfileFROM airdock/base:jessieRUN mkdir -p /srv/java/# Add java dynamic memory scriptCOPY java-dynamic-memory-opts /srv/java/# Install Oracle JDK 8u25RUN 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 variableENV JAVA_HOME=/srv/java/jdk \ PATH=${PATH}:/srv/java/jdk/bin:/srv/javaCOPY docker-entrypoint.sh /bin/ENTRYPOINT ["docker-entrypoint.sh"]
docker-entrypoint.sh#!/bin/bashjava -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
2, 使jdk环境通用化
想想为了运行一个jar包,定义个运行jar的jdk环境,有点得不偿失.思路:为了通用性,搞个指定版本jdk image,管他运行什么呢.
DockerfileFROM airdock/base:jessieRUN mkdir -p /srv/java/# Add java dynamic memory scriptCOPY java-dynamic-memory-opts /srv/java/# timezone 这里把时区改掉COPY localtime /etc/localtime# Install Oracle JDK 8u25RUN 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 variableENV JAVA_HOME=/srv/java/jdk \ PATH=${PATH}:/srv/java/jdk/bin:/srv/java
apiVersion: v1kind: Podmetadata: name: sms-test labels: app: sms-testspec: 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/bashjava -jar $1docker 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)HEALTHCHECKVOLUME (Shared Filesystems)USERWORKDIR
如何在k8s里指定docker run -w 的workdir
思路: 可以通过env方式
[root@k8s-master01 ma]# cat centos.yaml apiVersion: v1kind: Podmetadata: name: my-centos labels: app: centosspec: containers: - name: my-centos image: centos:6.8 imagePullPolicy: IfNotPresent command: ["top","-b"] env: - name: PWD value: "/tmp"
一个计时的pod
apiVersion: v1kind: Podmetadata: name: counterspec: 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/
阅读全文
0 0
- [k8s]args指令案例-彻底理解docker entrypoint
- [k8s]docker entrypoint图解
- Docker: 精通ENTRYPOINT指令
- 通过k8s的command和args配置Docker入口命令
- Docker镜像以及CMD与ENTRYPOINT指令的比较
- Docker中CMD与ENTRYPOINT的简明理解
- [k8s]k8s的command和args
- Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
- DOCKERFILE的CMD指令和ENTRYPOINT指令
- k8s,docker,mesos
- docker学习笔记(k8s)
- docker-k8s常用命令
- k8s docker集群搭建
- Docker宣布拥抱k8s,k8s将一统天下?
- 【docker】CMD ENTRYPOINT 区别 终极解读!
- docker和k8s基本操作
- 理解'*','*args','**','**kwargs'
- 理解'*','*args','**','**kwargs'
- image的尺寸的适配
- Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(二)
- C# Aspose.Word 操作word文档【五】
- java开发/10.1-10.3/邓聪
- 柱状图,饼状图,报表插件
- [k8s]args指令案例-彻底理解docker entrypoint
- dfs学习之打家劫舍(3)
- java web中监听本地磁盘文件,并进行上传,复制,处理等
- java中的基本数据类型
- 余弦相似度与正规化的欧氏距离的某种等价性
- Hibernate 初始化:获取SessionFactory的各种方式
- 20171012 SQL语句JOIN关键字
- 自定义圆角ImageView
- 从头编写 asp.net core 2.0 web api 基础框架 (3)