最近搞influxdb绘图,看到其dockerfile的entry.sh,无奈看的不是很懂. 因而查了下..html
实现启动镜像时候可指定配置文件 若是不指定,使用默认的配置 若是指定,即便用指定的配置
参考:
https://hub.docker.com/_/influxdb/
https://github.com/influxdata/influxdata-docker/blob/master/influxdb/1.4/entrypoint.shgit
docker run -p 8086:8086 \ -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf:ro \ influxdb -config /etc/influxdb/influxdb.conf
从dockerfile入手github
... ENTRYPOINT ["/entrypoint.sh"] CMD ["influxd"]
在看下entrypoint.shdocker
#!/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测试shell
$ 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来测测bash
#!/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
细节知识点测试
## ${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}" = '-' ]
name="maotai" $ cat 1.sh #!/bin/bash echo $name # 未输出任何(子bash没继承set的变量)
name="maotai" $ cat 1.sh echo $name # 输出maotai
小结:this
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.net
以前还绘制了图说明set和env关系:
参考:
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