109 lines
3.5 KiB
Bash
Executable File
109 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# docker entrypoint script
|
|
|
|
# 以下变量已在 Dockerfile 中定义,不需要修改
|
|
# APP_NAME: 应用名称,nginx
|
|
# APP_EXEC: 应用可执行二进制文件,nginx
|
|
# APP_USER: 应用对应的用户名,nginx
|
|
# APP_GROUP: 应用对应的用户组名,nginx
|
|
|
|
set -Eeo pipefail
|
|
|
|
LOG_RAW() {
|
|
local type="$1"; shift
|
|
printf '%s [%s] Entrypoint: %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$type" "$*"
|
|
}
|
|
LOG_I() {
|
|
LOG_RAW Note "$@"
|
|
}
|
|
LOG_W() {
|
|
LOG_RAW Warn "$@" >&2
|
|
}
|
|
LOG_E() {
|
|
LOG_RAW Error "$@" >&2
|
|
exit 1
|
|
}
|
|
|
|
LOG_I "Initial container for nginx"
|
|
|
|
# 检测当前脚本是被直接执行的,还是从其他脚本中使用 "source" 调用的
|
|
_is_sourced() {
|
|
[ "${#FUNCNAME[@]}" -ge 2 ] \
|
|
&& [ "${FUNCNAME[0]}" = '_is_sourced' ] \
|
|
&& [ "${FUNCNAME[1]}" = 'source' ]
|
|
}
|
|
|
|
# 使用root用户运行时,创建默认的数据目录,并拷贝所必须的默认配置文件及初始化文件
|
|
# 修改对应目录所属用户为应用对应的用户
|
|
# 使用--user指定用户时,挂载的数据卷及子目录下文件默认会映射会对应的用户,不用修改
|
|
docker_create_user_directories() {
|
|
local user_id; user_id="$(id -u)"
|
|
|
|
# 如果设置了'--user',这里 user_id 不为 0
|
|
# 如果没有设置'--user',这里 user_id 为 0,需要使用默认用户名设置相关目录权限
|
|
LOG_I "Check directories used by nginx"
|
|
mkdir -p "/var/log/nginx"
|
|
mkdir -p "/var/run/nginx"
|
|
mkdir -p "/var/cache/nginx"
|
|
|
|
mkdir -p "/srv/conf/nginx/conf.d"
|
|
[ ! -e /srv/conf/nginx/nginx.conf ] && cp /etc/nginx/nginx.conf.default /srv/conf/nginx/nginx.conf
|
|
[ ! -e /srv/conf/nginx/mime.types ] && cp /etc/nginx/mime.types /srv/conf/nginx/
|
|
[ ! -e /srv/conf/nginx/conf.d/default.conf ] && cp /etc/nginx/conf.d/default.conf /srv/conf/nginx/conf.d/
|
|
|
|
# 允许容器使用`--user`参数启动,修改相应目录的所属用户信息
|
|
if [ "$user_id" = '0' ]; then
|
|
LOG_I "Chang owner of resources to: nginx by root"
|
|
find /var/run/nginx \! -user nginx -exec chown nginx '{}' +
|
|
find /var/log/nginx \! -user nginx -exec chown nginx '{}' +
|
|
find /var/cache/nginx \! -user nginx -exec chown nginx '{}' +
|
|
find /srv/conf/nginx \! -user nginx -exec chown nginx '{}' +
|
|
chmod 755 /etc/nginx /var/log/nginx /var/cache/nginx /var/run/nginx /srv/conf/nginx
|
|
# 解决使用gosu后,nginx: [emerg] open() "/dev/stdout" failed (13: Permission denied)
|
|
chmod 0622 /dev/stdout /dev/stderr
|
|
fi
|
|
}
|
|
|
|
# 检测可能导致容器执行后直接退出的命令,如"--help";如果存在,直接返回 0
|
|
docker_app_want_help() {
|
|
local arg
|
|
for arg; do
|
|
case "$arg" in
|
|
-'?'|-h|-V|-v|-t|-T)
|
|
return 0
|
|
;;
|
|
esac
|
|
done
|
|
return 1
|
|
}
|
|
|
|
_main() {
|
|
# 如果命令行参数是以配置参数("-")开始,修改执行命令,确保使用可执行应用命令启动服务器
|
|
if [ "${1:0:1}" = '-' ]; then
|
|
LOG_I "Add nginx at the begin of command line"
|
|
set -- nginx "$@"
|
|
fi
|
|
|
|
# 命令行参数以可执行应用命令起始,且不包含直接返回的命令(如:-V、--version、--help)时,执行初始化操作
|
|
if [ "$1" = "nginx" ] && ! docker_app_want_help "$@"; then
|
|
|
|
# 以root用户运行时,设置数据存储目录与权限;设置完成后,会使用gosu重新以"postgres"用户运行当前脚本
|
|
docker_create_user_directories
|
|
if [ "$(id -u)" = '0' ]; then
|
|
LOG_I "Restart container with default user: nginx"
|
|
LOG_I ""
|
|
exec gosu nginx "$0" "$@"
|
|
fi
|
|
fi
|
|
|
|
LOG_I "Start container with: $@"
|
|
|
|
# 执行命令行
|
|
exec "$@"
|
|
}
|
|
|
|
if ! _is_sourced; then
|
|
LOG_I "Run shell script with: $@"
|
|
_main "$@"
|
|
fi
|