最近搞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脚本解析的更多相关文章

  1. [sh]shell脚本栗子

    我会定期的把看到的一些好的shell和py脚本搜集在这里,供参考学习: 命令行回收站 推荐一个不相关的:trash-cli,就是命令行版的回收站,它的神奇之处在于不是简单的把文件移动到回收站,而且可以 ...

  2. shell脚本解析json文件

    安装jq扩展 下载:jq 根据自己系统下载对应的文件 cp jq-linux64 /usr/bin cd /usr/bin mv jq-linux64 jq chmod +x jq 使用方法 假设有个 ...

  3. shell 脚本关键字&符号

    shell概念 "shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字 shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译 ...

  4. Shell脚本1

    1Shell编程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell脚本 Shell 脚本(shell scr ...

  5. shell脚本学习第一课

    shell是一种程序设计语言,是访问操作系统内核的服务. Linux的shell种类常见的有: Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell ...

  6. Shell - Shell脚本调试方法

    Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...

  7. 第1章:认识Shell脚本

     第一章:认识Shell脚本 1.1.什么是Shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. 实际上Shell是一个命令解释器 ...

  8. Shell脚本编程与文件系统修复

    导读 Linux基金会发起了LFCS认证(Linux 基金会认证系统管理员)Linux Foundation Certified Sysadmin,这是一个全新的认证体系,旨在让世界各地的人能够参与到 ...

  9. shell脚本实例一

    一. 什么是shell 脚本时一种解释性语言: shell脚本保存执行动作: 脚本判定命令的执行条件 脚本来实现动作的批量执行.二.如何创建 vim  test.sh     ##shell脚本一般都 ...

随机推荐

  1. 重新总结flex布局(flex,flex-direction,justify-content,align-items,flex-wrap,align-self)

    1.flex,主要就是按比例分配.(例如:两个div的flex:1,就大小相等) .box1{ flex:1; background-color: red; } .box2{ flex:1; back ...

  2. jeecms运行出现 Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.解决

    在/WEB-INF/config/application-context.xml中添加红色字体内容: <bean id="dataSource" class="co ...

  3. meterpreter源码

    /*    by codeliker @2014.12.08    github: https://github.com/codeliker*/ #include <WinSock2.h> ...

  4. ArrayList的使用和List<T>的比较

    使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序利用 .NET Framework 基类库中的 ArrayList 集合类.ArrayList 是一个使用起来非常方便的集合类,无需进行修改即 ...

  5. Nicescroll滚动条插件的用法

    Nicescroll滚动条插件是一个非常强大的基于jQuery的滚动条插件,不需要增加额外的css,几乎全浏览器兼容.ie6+,实现只需要一段代码,侵入性非常小,样式可完全自定义,支持触摸事件,可在触 ...

  6. IIS6.0 开启Gzip与PHP Gzip

    因为在做一个项目,项目里面服务器主要提供数据,但是数据多了文件就大了,比较浪费流量和时间,我们便用Gzip来处理.我在本机上是apache,服务器上是IIS6.0,用的是php,那么我就在这里分享一下 ...

  7. 如何在代码中设置以dp为单位的长度

    获取当前屏幕的密度系数 ,并设置控件以dp为单位的长宽   float density = getResources().getDisplayMetrics().density;   params = ...

  8. LeetCode 303 Range Sum Query - Immutable(范围总和查询-永久不变)(*)

    翻译 给定一个整型数组nums,找出在索引i到j(i小于等于j)之间(包含i和j)的全部元素之和. 比如: 给定nums = [-2,0,3,-5,2,-1] sumRange(0, 2) -> ...

  9. Struts完美解决i18n问题

    所谓的i18n问题指的是(软件的)国际化问题,简单来讲就是使我们的软件可以让世界使用任何语言的人们都能使用,软件自身会根据语言环境的不同进行自动配置,如果你是中文环境那界面以中文显示,如果是英文环境就 ...

  10. 手动脱UPX 壳实战

    作者:Fly2015 Windows平台的加壳软件还是比較多的,因此有非常多人对于PC软件的脱壳乐此不彼,本人菜鸟一枚,也学习一下PC的脱壳.要对软件进行脱壳.首先第一步就是 查壳.然后才是 脱壳. ...