| 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" |