[svc]entrypoint.sh shell脚本解析
最近搞influxdb绘图,看到其dockerfile的entry.sh,无奈看的不是很懂. 于是查了下..
docker run 通过传参实现配置文件覆盖
实现启动镜像时候可指定配置文件
如果不指定,使用默认的配置
如果指定,即使用指定的配置
参考:
https://hub.docker.com/_/influxdb/
https://github.com/influxdata/influxdata-docker/blob/master/influxdb/1.4/entrypoint.sh
docker run -p 8086:8086 \
-v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf:ro \
influxdb -config /etc/influxdb/influxdb.conf
从dockerfile入手
...
ENTRYPOINT ["/entrypoint.sh"]
CMD ["influxd"]
在看下entrypoint.sh
#!/bin/bash
set -e
if [ "${1:0:1}" = '-' ]; then
set -- influxd "$@" # -> influxd -conf 1 2 3
fi
if [ "$1" = 'influxd' ]; then
/init-influxdb.sh "${@:2}" # -> /init-influxdb.sh -conf 1 2 3
fi
echo $@
#exec "$@" # -> influxd -conf 1 2 3
徒手执行entry.sh测试
$ sh entrypoint.sh 1 2 3
1 2 3
1 2 3
$ sh entrypoint.sh -conf 1 2 3
influxd - 1 2 3
init-influxdb.sh -conf 1 2 3
可见如果加了 -conf就会赋值
为了便于弄清原理,修改entrypoint.sh来测测
#!/usr/bin/env bash
set -e
if [ "${1:0:1}" = '-' ]; then
set -- influxd "$@" # -> influxd -conf 1 2 3
fi
echo $@
if [ "$1" = 'influxd' ]; then
echo "/init-influxdb.sh "${@:2}"" # -> /init-influxdb.sh -conf 1 2 3
fi
echo $@
#exec "$@" # -> influxd -conf 1 2 3
$ sh entrypoint.sh 1 2 3
1 2 3
1 2 3
$ sh entrypoint.sh -conf 1 2 3
influxd - 1 2 3
/init-influxdb.sh -conf 1 2 3
influxd -conf 1 2 3
可见这个脚本本质实现的是:
如果
sh entrypoint.sh influxd
influxdb
如果
sh entrypoint.sh -config 1 2 3
influxdb -conf 1 2 3
细节知识点
shell中截取字符串和数组
## ${str:a:b}含义
参考: https://zhidao.baidu.com/question/559065726.html
${str:a:b} 表示提取字符串a开始的b个字符
str="abcd"
echo ${str:0:3}
结果是abc
## 数组获取选项
参考: https://unix.stackexchange.com/questions/249869/meaning-of-101
arr=(1 2 3 4 5)
#输出第一项
echo ${arr[1]}
#输出所有项
echo ${arr[@]}
#截取数组选项-从第3项到最后一项
echo ${arr[@]:3}
4 5
从第0项到第一项
echo ${arr[@]:0:3}
1 2 3
## 判断第一个选项的第一个字符
if [ "${1:0:1}" = '-' ]
set env exec环境变量

sh 1.sh,开子bash执行完毕脚本
name="maotai"
$ cat 1.sh
#!/bin/bash
echo $name
# 未输出任何(子bash没继承set的变量)
source 1.sh,不开启子bash: source不会开子bash
name="maotai"
$ cat 1.sh
echo $name
# 输出maotai
小结:
exec,不会开子bash,会把进程生命赋给要执行的命令
exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行
bash shell的命令分为两类:外部命令和内部命令
参考(很经典):http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580749.html
http://blog.csdn.net/clozxy/article/details/5818465
之前还绘制了图说明set和env关系:

使用set设置变量: 实现形参移位
参考:
https://unix.stackexchange.com/questions/308260/what-does-set-do-in-this-dockerfile-entrypoint
$ set a b c
$ echo $1
a
$ echo $2
b
$ echo $3
c
set -- influxdb "$@"
$ echo $1,$2,$3
a,b,c
$ set -- influxdb "$@"
$ echo $1,$2,$3,$4
influxdb,a,b,c
$# $@的区别
$# 将所有参数当成字符串,赋值给所有
$@ 将所有参数当作数组,一项一项赋值
直观体验
for i in "$@";do
echo $i
done
echo "----------------------"
for i in "$*";do
echo $i
done
[svc]entrypoint.sh shell脚本解析的更多相关文章
- [sh]shell脚本栗子
我会定期的把看到的一些好的shell和py脚本搜集在这里,供参考学习: 命令行回收站 推荐一个不相关的:trash-cli,就是命令行版的回收站,它的神奇之处在于不是简单的把文件移动到回收站,而且可以 ...
- shell脚本解析json文件
安装jq扩展 下载:jq 根据自己系统下载对应的文件 cp jq-linux64 /usr/bin cd /usr/bin mv jq-linux64 jq chmod +x jq 使用方法 假设有个 ...
- shell 脚本关键字&符号
shell概念 "shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字 shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译 ...
- Shell脚本1
1Shell编程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell脚本 Shell 脚本(shell scr ...
- shell脚本学习第一课
shell是一种程序设计语言,是访问操作系统内核的服务. Linux的shell种类常见的有: Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell ...
- Shell - Shell脚本调试方法
Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...
- 第1章:认识Shell脚本
第一章:认识Shell脚本 1.1.什么是Shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. 实际上Shell是一个命令解释器 ...
- Shell脚本编程与文件系统修复
导读 Linux基金会发起了LFCS认证(Linux 基金会认证系统管理员)Linux Foundation Certified Sysadmin,这是一个全新的认证体系,旨在让世界各地的人能够参与到 ...
- shell脚本实例一
一. 什么是shell 脚本时一种解释性语言: shell脚本保存执行动作: 脚本判定命令的执行条件 脚本来实现动作的批量执行.二.如何创建 vim test.sh ##shell脚本一般都 ...
随机推荐
- C#调用API向外部程序发送数据
C#调用API向外部程序发送数据 最近有可能要做一个项目.在项目中有这么一个功能,在A程序中调用B程序,同时在A程序中进行登陆后,要将A程序的登录名和密码自动填充到B程序的登陆对话框中,这样B程序就不 ...
- 《iOS应用逆向工程:分析与实战》
<iOS应用逆向工程:分析与实战> 基本信息 作者: 沙梓社 吴航 刘瑾 丛书名: 信息安全技术丛书 出版社:机械工业出版社 ISBN:9787111450726 上架时间:2 ...
- error: <class 'xml.parsers.expat.ExpatError'>, syntax error: line 1, column 0: file: /usr/local/lib/python2.7/xmlrpclib.py line: 557
当linux设备上开启sonar6.2时, supervisorctl status报如下错误: error: <class 'xml.parsers.expat.ExpatError'> ...
- Webview 支持文件上传
默认情况下情况下,在一个带有input tpye=file标签的Html页面,使用Android的WebView是不能够支持上传文件的(在iOS和微信上完全正常工作).而这个,也是在我们的前端工程师告 ...
- 努力让java学习系统化
这段日子接手一社区系统的开发.开发过程中感觉到自己接触到的和所作的多是业务逻辑性开发,对java开发到如今还没有一个清晰明白的路线,我越来越感觉到问题的重要性. 问题一:代码仅仅注重了功能实现,对代码 ...
- Android -- Activity的销毁和重建
两种销毁 第一种是正常的销毁,比如用户按下Back按钮或者是activity自己调用了finish()方法: 另一种是由于activity处于stopped状态,并且它长期未被使用,或者前台的acti ...
- .NET-DataTable或DataSet转JSON
通过AJAX异步减少网络内容传输,而JSON则可以把传输内容缩减到纯数据:然后利用jQuery内置的AJAX功能直接获得JSON格式的数据:在客户端直接绑定到数据控件里面,从而达到最优. #regio ...
- 《javascript高级程序设计》读书笔记(一)javascript简单介绍
第一章:javascript简单介绍 Netscape Navigator 开发的javascript Javascript的实现有三部分: 1.核心(ECMAScript):提供核心语言功能. ...
- AVAudioPlayer播放在线音频文件
AVAudioPlayer播放在线音频文件 一:原里: AVAudioPlayer是不支持播放在线音频的,但是AVAudioPlayer有一个 initWithData的方法:我们可以把在线音频转换为 ...
- 设计模式 - 模板方法模式(template method pattern) 具体解释
模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...