kodexplorer / Dockerfile
host1syan's picture
Update Dockerfile
b3e8fff verified
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