FROM openlistteam/openlist:latest WORKDIR /opt/openlist USER root EXPOSE 5244 CMD sh -c "\ # 1. 启动服务 ./openlist server & \ PID=\$!; \ \ # 2. 等待服务就绪 echo '⏳ 正在等待 OpenList 服务启动...'; \ sleep 8; \ \ MAX_RETRIES=10; \ while ! wget -q --spider http://127.0.0.1:5244/api/public/settings; do \ sleep 2; \ MAX_RETRIES=\$((MAX_RETRIES - 1)); \ if [ \$MAX_RETRIES -le 0 ]; then \ echo '❌ 错误: 服务启动超时。'; exit 1; \ fi; \ done; \ \ echo '✅ 服务已就绪!'; \ \ # 3. 校验管理员密码 if [ -z \"\$OPENLIST_ADMIN_PASSWORD\" ]; then \ echo '❌ 错误: 未配置 OPENLIST_ADMIN_PASSWORD。'; \ wait \$PID; exit 1; \ fi; \ \ # 4. 获取 Token echo '🔑 正在获取 Token...'; \ RAW_TOKEN=\$(wget -qO- --timeout=5 --post-data=\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"\$OPENLIST_ADMIN_PASSWORD\\\"}\" \ --header='Content-Type: application/json' \ http://127.0.0.1:5244/api/auth/login); \ \ TOKEN=\$(echo \$RAW_TOKEN | grep -o '\"token\":\"[^\"]*\"' | cut -d'\"' -f4); \ \ # 5. 注入逻辑 (支持原始换行格式) if [ -n \"\$TOKEN\" ] && [ \"\${#TOKEN}\" -gt 20 ]; then \ echo '🚀 登录成功,正在处理存储配置...'; \ FOUND_VALID=0; \ \ for i in 1 2 3 4 5 6 7 8 9 10; do \ # --- 关键:使用 printenv 获取原始 JSON --- JSON_BODY=\$(printenv STORAGE_JSON_\$i); \ \ if [ -z \"\$JSON_BODY\" ]; then \ continue; \ fi; \ \ FOUND_VALID=1; \ # 将原始 JSON 写入临时文件,确保换行和转义原样保留 echo \"\$JSON_BODY\" > /tmp/payload.json; \ \ if ! grep -q '\"mount_path\"' /tmp/payload.json; then \ echo \"⚠️ STORAGE_JSON_\$i 格式不完整,已跳过。\"; \ rm /tmp/payload.json; continue; \ fi; \ \ echo \"📦 正在推送第 \$i 个配置到 API...\"; \ # 使用 --post-file 直接发送文件内容,避开 Shell 转义 RES=\$(wget -qO- --timeout=10 --post-file=/tmp/payload.json \ --header=\"Content-Type: application/json\" \ --header=\"Authorization: \$TOKEN\" \ http://127.0.0.1:5244/api/admin/storage/create); \ \ echo \"响应内容: \$RES\"; \ rm /tmp/payload.json; \ echo ''; \ done; \ \ [ \"\$FOUND_VALID\" -eq 0 ] && echo 'ℹ️ 提示: 未发现有效的存储配置。'; \ echo '✅ 注入流程处理完毕!'; \ else \ echo '❌ 登录失败!内容: ' \${RAW_TOKEN:-'无响应'}; \ fi; \ \ # 维持主进程 wait \$PID"