一个有用的docker entrypoint脚本的范例

$ cat docker-entrypoint.sh

bash 复制代码
#!/usr/bin/env sh
set -e

loglevel="${loglevel:-}"
USERID=$(id -u)


# if the first argument look like a parameter (i.e. start with '-'), run Envoy
if [ "${1#-}" != "$1" ]; then
    set -- envoy "$@"
fi

if [ "$1" = 'envoy' ]; then
    # set the log level if the $loglevel variable is set
    if [ -n "$loglevel" ]; then
        set -- "$@" --log-level "$loglevel"
    fi
fi

if [ "$ENVOY_UID" != "0" ] && [ "$USERID" = 0 ]; then
    if [ -n "$ENVOY_UID" ]; then
        usermod -u "$ENVOY_UID" envoy
    fi
    if [ -n "$ENVOY_GID" ]; then
        groupmod -g "$ENVOY_GID" envoy
    fi
    # Ensure the envoy user is able to write to container logs
    chown envoy:envoy /dev/stdout /dev/stderr
    exec su-exec envoy "${@}"
else
    exec "${@}"
fi

这个脚本 docker-entrypoint.sh 是一个 Docker 容器的入口脚本,用于设置和执行 Envoy 代理服务器。下面是对脚本的逐行解释:

  1. #!/usr/bin/env sh:这是 shebang 行,告诉系统使用哪个解释器来执行脚本。这里使用的是 sh shell。

  2. set -e:这个命令告诉 shell 在任何语句的执行结果不是 true 时就终止执行,这有助于捕获错误。

  3. loglevel="${loglevel:-}":这行设置了 loglevel 变量的值,如果环境变量 loglevel 已经设置,则使用其值,否则为空。

  4. USERID=$(id -u):获取当前用户的用户ID。

  5. if [ "${1#-}" != "$1" ]; then:检查脚本的第一个参数是否以连字符 - 开头。如果是,说明可能是一个选项参数。

  6. set -- envoy "$@":如果第一个参数是选项,将 envoy 添加到参数列表的前面,并保留所有原始参数。

  7. if [ "$1" = 'envoy' ]; then:检查第一个参数是否是 envoy,即是否要启动 Envoy 代理。

  8. if [ -n "$loglevel" ]; then:如果 loglevel 变量已经设置,并且不为空。

  9. set -- "$@" --log-level "$loglevel":将 --log-level 选项和 loglevel 值添加到参数列表中。

  10. if [ "$ENVOY_UID" != "0" ] && [ "$USERID" = 0 ]; then:如果 ENVOY_UID 环境变量设置且不等于 0,并且当前用户是 root 用户(用户ID 为 0)。

  11. usermod -u "$ENVOY_UID" envoy:改变用户 envoy 的用户ID为 ENVOY_UID

  12. groupmod -g "$ENVOY_UID" envoy:改变用户 envoy 的组ID为 ENVOY_GID

  13. chown envoy:envoy /dev/stdout /dev/stderr:确保 envoy 用户拥有对标准输出和标准错误的所有权,以便能够写入容器日志。

  14. exec su-exec envoy "${@}":使用 su-execenvoy 用户身份执行参数列表中的命令。

  15. else:如果上面的条件不满足,即不是以 root 用户身份运行,或者 ENVOY_UID 没有设置。

  16. exec "${@}":直接执行参数列表中的命令。

这个脚本的主要目的是在 Docker 容器启动时,根据提供的参数和环境变量配置 Envoy 代理,并以适当的用户身份执行它。如果容器以 root 用户身份启动,并且定义了 ENVOY_UIDENVOY_GID,则会更改 Envoy 用户的 UID 和 GID,并以该用户身份执行 Envoy。如果没有定义这些环境变量,或者不是以 root 用户身份启动,它将直接执行 Envoy 或其他传递的命令。

相关推荐
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn861 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_1 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉1 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦1 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875241 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant