docker中某镜像 entrypoint脚本解读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
set -e # 在每个脚本开头都应该记上这句,意思是告诉bash如果任何语句的执行结果不是true则退出,这样的好处是防止错误像雪球一样越滚越大
if [ "${1:0:1}" = '-' ]; then # 该句判断是否是以-开头的选项 ${1:0:1} 对参数$1 从offset0开始截取长度1的字符 ${parameter:offset:length}
set -- elasticsearch "$@" # 标记1 该句的意思是如果命令docker启动命令只加了参数的话,补上elasticsearch命令
fi
# Drop root privileges if we are running elasticsearch
# allow the container to be started with `--user`
if [ "$1" = 'elasticsearch' -a "$(id -u)" = '0' ]; then
# Change the ownership of user-mutable directories to elasticsearch
for path in \
/usr/share/elasticsearch/data \
/usr/share/elasticsearch/logs \
; do
chown -R elasticsearch:elasticsearch "$path"
done
set -- gosu elasticsearch "$@" # 再次修改参数,用elasticsearch账号执行 命令。gosu 等同于 sudo,并规避了sudo的一些问题, https://segmentfault.com/a/1190000004527476
#exec gosu elasticsearch "$BASH_SOURCE" "$@"
fi
exec "$@" # 內建指令 exec 的功能與用途是相當特殊的。如果使用 exec 來執行“指令”,在“指令”執行完畢結果輸出之後,原先的 C shell 也會跟著終結

标记1
— 是参数的终止符,意思是不要将— 后的任意字符当做是-xx参数
set a b c 意思是设定$1 $2 $3 为 a b c
​$@ 是所有参数
例如

1
set -- elasticsearch "$@" 最终解析为elasticsearch 参数

exec date # 输出date内容后自动退出shell