Spaces:
Running
Running
| 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 |