一个有用的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 或其他传递的命令。

相关推荐
霁月的小屋5 分钟前
Docker 工程化实践(六):Docker Compose 管理多容器应用
运维·docker·容器
luyun02020236 分钟前
论坛里的小工具,吾爱出品
运维·服务器·windows
江湖有缘41 分钟前
Docker实战 | 使用Docker部署EasyNode服务器面板工具
服务器·docker·容器
心机之蛙qee1 小时前
Docker Compose 多容器编排
java·docker·容器
AI大佬的小弟1 小时前
私有化 Dify 应用开发(1):Dify 入门|Docker 一键部署全流程
docker·大模型落地·ai 应用开发·dify 教程·私有化 ai 部署·docker 实战·开源 ai 平台
Miao121311 小时前
工程交付指标入门:如何重新掌控软件交付
大数据·运维·devops
涛声依旧393161 小时前
运维项目:InnoAI SQL 助手
运维·数据库·sql
养海绵宝宝的小蜗2 小时前
LVS(Linux Virtual Server)项目知识点总结
linux·运维·lvs
ShiXZ2132 小时前
Docker 安装 Elasticsearch 7.17.6 完整教程
elasticsearch·docker·容器
joopthd3 小时前
打破进口垄断:TDLAS/UV-DOAS/FTIR 全光谱检测国产器件全产业链布局(江苏旭海光电技术梳理)
运维·人工智能·uv·激光气体检测