openlist / Dockerfile
LogLInk1K's picture
Update Dockerfile
c8145a5 verified
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"