docker-webman-jsonrpc/run

197 lines
5.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 读取docker.conf文件
source docker.conf
# 设置系统环境变量
export WORKERMAN_CONTAINER_NAME=$container_name
export WORKERMAN_IMAGE_VERSION=$image_version
service_name="webman-jsonrpc"
# 检查docker-compose.yml文件是否存在
if [ ! -f "docker-compose.yml" ]; then
echo "Error: docker-compose.yml file not found"
exit 1
fi
# 自动生成.env文件对应的.env.example文件
generate_env_example() {
# 清空原有的.env.example文件中的内容
> .env.example
# 逐行读取.env文件
while IFS= read -r line; do
# 去除首尾空格
line=$(echo "$line" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
# 如果是注释行或空白行,直接写入.env.example文件
if [[ $line == \#* || -z $line ]]; then
echo "$line" >> .env.example
# 如果是键值对行,判断键名是否包含指定字符串
elif [[ $line == *=* ]]; then
key=$(echo "$line" | cut -d= -f1)
value=$(echo "$line" | cut -d= -f2-)
# 如果键名包含指定字符串,将值清空写入.env.example文件
if [[ $key == *KEY || $key == *PASSWORD || $key == *SECRET || $key == *PASS || $key == *TOKEN || $key == *ID ]]; then
echo "$key=" >> .env.example
# 否则,清除首尾空格后原样写入.env.example文件
else
echo "$key=$value" >> .env.example
fi
fi
done < .env
}
# 每次run后都自动生成.env.example文件
generate_env_example
# 定义帮助函数
show_help() {
echo "Usage: ./run [COMMAND] [OPTION]"
echo ""
echo "Commands:"
echo " start run once"
echo " status service status(daemon mode only)"
echo " reload reload files(daemon mode only)"
echo " restart restart service(daemon mode only)"
echo " stop stop service and container"
echo " init delete container and rebuild"
echo " destroy stop & remove the container"
echo " help show this help message"
echo "Options:"
echo " -d run in daemon mode.(start, restart, init)"
}
# 定义安装依赖的函数
install_dependencies() {
# 执行一次composer install
docker compose run --rm "$service_name" composer install
}
# 判断容器是否存在并且正在运行
is_container_running() {
if docker ps -a --format '{{.Names}}' | grep -q "$WORKERMAN_CONTAINER_NAME"; then
if docker ps --format '{{.Names}}' | grep -q "$WORKERMAN_CONTAINER_NAME"; then
return 0
else
return 1
fi
else
return 2
fi
}
# 判断是否需要在后台运行
is_daemon_mode() {
for arg in "$@"; do
if [[ "$arg" == "-d" ]]; then
return 1
fi
done
return 0
}
# 解析命令行参数
case "$1" in
start)
# 判断容器是否存在并且正在运行
if is_container_running; then
echo "container $WORKERMAN_CONTAINER_NAME is already running"
exit 1
elif [[ $? -eq 1 ]]; then
# 存在但未运行,直接启动
if is_daemon_mode "$@"; then
docker start -a "$WORKERMAN_CONTAINER_NAME"
else
docker start "$WORKERMAN_CONTAINER_NAME"
fi
else
# 不存在执行docker-compose up
if is_daemon_mode "$@"; then
docker compose up
else
docker compose up -d
fi
fi
;;
restart)
# 判断容器是否存在并且正在运行
if is_container_running; then
if is_daemon_mode "$@"; then
docker stop "$WORKERMAN_CONTAINER_NAME"
docker start -a "$WORKERMAN_CONTAINER_NAME"
else
docker restart "$WORKERMAN_CONTAINER_NAME"
fi
elif [[ $? -eq 1 ]]; then
# 存在但未运行,直接启动
if is_daemon_mode "$@"; then
docker start -a "$WORKERMAN_CONTAINER_NAME"
else
docker start "$WORKERMAN_CONTAINER_NAME"
fi
else
# 不存在执行docker-compose up
if is_daemon_mode "$@"; then
docker compose up
else
docker compose up -d
fi
fi
;;
stop)
docker stop "$WORKERMAN_CONTAINER_NAME"
;;
reload)
# 判断容器是否存在并且正在运行
if is_container_running; then
# 执行start.php reload命令
docker exec -it "$WORKERMAN_CONTAINER_NAME" php start.php reload
else
echo "container $WORKERMAN_CONTAINER_NAME is not running"
exit 1
fi
;;
status)
# 判断容器是否存在并且正在运行
if is_container_running; then
# 执行start.php status命令
docker exec -it "$WORKERMAN_CONTAINER_NAME" php start.php status
else
echo "container $WORKERMAN_CONTAINER_NAME is not running"
exit 1
fi
;;
init)
read -p "Will delete current container. Are you sure? (y/n)" confirm
if [ "$confirm" != "y" ]; then
echo "Aborted."
exit 1
fi
docker rm -f "$WORKERMAN_CONTAINER_NAME"
# 执行docker-compose up
if is_daemon_mode "$@"; then
docker compose up
else
docker compose up -d
fi
;;
destroy)
read -p "Are you sure you want to destroy the container? (y/n)" confirm
if [ "$confirm" = "y" ]; then
docker rm -f "$WORKERMAN_CONTAINER_NAME"
echo "Container $WORKERMAN_CONTAINER_NAME has been destroyed."
else
echo "Aborted."
exit 1
fi
;;
help)
show_help
;;
*)
echo "Error: Invalid command"
show_help
exit 1
;;
esac