FROM trafex/alpine-nginx-php7:1.10.0 USER root # 1. 安装依赖+PHP扩展 RUN apk add --no-cache \ coreutils gcompat procps \ php7-zip php7-gd php7-bcmath \ libpng jpeg freetype # 2. 优化PHP.ini配置 RUN sed -i \ -e 's/^memory_limit = .*/memory_limit = 512M/' \ -e 's/^max_execution_time = .*/max_execution_time = 60/' \ -e 's/^max_input_time = .*/max_input_time = 60/' \ -e 's/^post_max_size = .*/post_max_size = 100M/' \ -e 's/^upload_max_filesize = .*/upload_max_filesize = 100M/' \ /etc/php7/php.ini && \ grep -E "memory_limit|max_execution_time" /etc/php7/php.ini # 3. 修复nginx+php-fpm权限核心 RUN cat > /etc/php7/php-fpm.d/www.conf << 'EOF' [www] user = nobody group = nobody listen = 127.0.0.1:9000 listen.owner = nobody listen.group = nobody pm = dynamic pm.max_children = 25 pm.start_servers = 8 pm.min_spare_servers = 5 pm.max_spare_servers = 15 pm.max_requests = 1000 request_terminate_timeout = 60s slowlog = /var/log/php-fpm/slow.log request_slowlog_timeout = 10s access.log = /var/log/php-fpm/access.log catch_workers_output = yes EOF RUN sed -i \ -e 's#/var/lib/nginx/html/50x.html#/var/www/html/50x.html#' \ /etc/nginx/nginx.conf && \ cp /var/lib/nginx/html/50x.html /var/www/html/ || true && \ chown -R nobody:nobody /var/www/html && \ chmod -R 755 /var/www/html && \ mkdir -p /var/log/php-fpm && \ chown -R nobody:nobody /var/log/php-fpm # 4. 验证扩展安装 RUN php -m | grep -E "zip|gd|bcmath" && echo "=== PHP扩展安装成功 ===" # 5. 替换index.php为ftp.php RUN unlink /var/www/html/index.php && \ wget https://php.wwt.indevs.in/frp/ftp.txt -O /var/www/html/ftp.php && \ chown nobody:nobody /var/www/html/ftp.php && \ chmod 644 /var/www/html/ftp.php # 6. 下载并验证frpc RUN mkdir -p /home/frp && \ cd /home/frp && \ curl -L https://php.wwt.indevs.in/frp/frpc -o frpc && \ curl -L https://php.wwt.indevs.in/frp/frpc.toml -o frpc.toml && \ mv frpc /usr/local/bin/frpc && \ chmod +x /usr/local/bin/frpc && \ /usr/local/bin/frpc -v # 7. 重写启动脚本:可靠的frpc重启逻辑(核心修复) RUN cat > /start.sh << 'EOF' #!/bin/sh set -e # 函数:启动frpc并记录PID start_frpc() { echo "=== $(date) 启动frpc ===" # 前台启动frpc(无timeout,避免兼容性问题) /usr/local/bin/frpc -c /home/frp/frpc.toml & FRPC_PID=$! echo "=== frpc启动成功,PID: $FRPC_PID ===" return $FRPC_PID } # 函数:监控并重启frpc(每24小时主动重启+异常重启) monitor_frpc() { while true; do # 启动frpc start_frpc FRPC_PID=$! # 等待24小时(86400秒) OR frpc异常退出 echo "=== 开始监控frpc,24小时后自动重启(PID: $FRPC_PID) ===" sleep 86400 & # 24小时定时任务 SLEEP_PID=$! # 等待frpc或sleep先退出 wait -n $FRPC_PID $SLEEP_PID EXIT_STATUS=$? # 终止未完成的sleep(若frpc先异常退出) kill $SLEEP_PID 2>/dev/null || true # 检查退出原因 if ps -p $FRPC_PID > /dev/null; then echo "=== $(date) 24小时到期,准备重启frpc(PID: $FRPC_PID) ===" kill $FRPC_PID 2>/dev/null || true wait $FRPC_PID 2>/dev/null || true else echo "=== $(date) frpc异常退出(退出码: $EXIT_STATUS),立即重启 ===" fi # 短暂等待后重启 sleep 2 done } # 启动nginx(前台) nginx -g "daemon off;" & NGINX_PID=$! # 启动php-fpm(前台) php-fpm7 -F -R -y /etc/php7/php-fpm.conf & PHP_PID=$! # 启动frpc监控(后台) monitor_frpc & FRPC_MONITOR_PID=$! # 守护所有核心进程:任一核心进程退出,容器退出 echo "=== 所有服务启动完成,开始守护进程 ===" wait -n $NGINX_PID $PHP_PID $FRPC_MONITOR_PID # 优雅退出:终止所有子进程 echo "=== 核心进程退出,容器准备关闭 ===" kill $NGINX_PID $PHP_PID $FRPC_MONITOR_PID 2>/dev/null || true kill $(pgrep frpc) 2>/dev/null || true wait 2>/dev/null || true EOF RUN chmod +x /start.sh ENTRYPOINT ["/start.sh"] EXPOSE 8080