docker中某镜像 entrypoint脚本解读 发表于 2018-12-21 1234567891011121314151617181920212223set -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" "$@"fiexec "$@" # 內建指令 exec 的功能與用途是相當特殊的。如果使用 exec 來執行“指令”,在“指令”執行完畢結果輸出之後,原先的 C shell 也會跟著終結 标记1— 是参数的终止符,意思是不要将— 后的任意字符当做是-xx参数set a b c 意思是设定$1 $2 $3 为 a b c$@ 是所有参数例如 1set -- elasticsearch "$@" 最终解析为elasticsearch 参数 exec date # 输出date内容后自动退出shell