|
| 1 | +#!/bin/sh |
| 2 | +# Docker 容器启动脚本 |
| 3 | +# 在容器启动时注入环境变量到 HTML 文件中 |
| 4 | + |
| 5 | +# 默认值 |
| 6 | +VITE_API_BASE="${VITE_API_BASE:-http://localhost:3000}" |
| 7 | + |
| 8 | +# 替换 HTML 中的占位符(配置注入失败不应阻止容器启动) |
| 9 | +if [ -f /app/dist/index.html ]; then |
| 10 | + # 转义 sed 替换字符串中的特殊字符(& 和 \) |
| 11 | + # 使用 | 作为分隔符避免与 URL 中的 / 冲突 |
| 12 | + # 先转义 \,再转义 & |
| 13 | + ESCAPED_API_BASE=$(echo "${VITE_API_BASE}" | sed 's/\\/\\\\/g; s/&/\\&/g' 2>/dev/null || echo "${VITE_API_BASE}") |
| 14 | + |
| 15 | + # 转义 JSON 字符串中的特殊字符(用于 JavaScript 代码) |
| 16 | + JSON_ESCAPED_API_BASE=$(echo "${VITE_API_BASE}" | sed 's/\\/\\\\/g; s/"/\\"/g' 2>/dev/null || echo "${VITE_API_BASE}") |
| 17 | + |
| 18 | + # 首先尝试替换占位符(如果存在) |
| 19 | + if grep -q "__VITE_API_BASE_PLACEHOLDER__" /app/dist/index.html 2>/dev/null; then |
| 20 | + # 使用 sed 替换占位符(Alpine/busybox 兼容) |
| 21 | + if sed -i "s|__VITE_API_BASE_PLACEHOLDER__|${ESCAPED_API_BASE}|g" /app/dist/index.html 2>/dev/null; then |
| 22 | + echo "✓ 已注入 VITE_API_BASE: ${VITE_API_BASE}" |
| 23 | + elif sed "s|__VITE_API_BASE_PLACEHOLDER__|${ESCAPED_API_BASE}|g" /app/dist/index.html > /tmp/index.html.tmp 2>/dev/null && \ |
| 24 | + mv /tmp/index.html.tmp /app/dist/index.html 2>/dev/null; then |
| 25 | + echo "✓ 已注入 VITE_API_BASE: ${VITE_API_BASE}" |
| 26 | + else |
| 27 | + echo "⚠ 警告: 占位符替换失败,尝试插入配置脚本" |
| 28 | + # 如果替换失败,尝试在 </head> 前插入配置脚本 |
| 29 | + CONFIG_SCRIPT="<script>window.__ROTE_CONFIG__=window.__ROTE_CONFIG__||{};window.__ROTE_CONFIG__.VITE_API_BASE=\"${JSON_ESCAPED_API_BASE}\";</script>" |
| 30 | + if sed -i "s|</head>|${CONFIG_SCRIPT}</head>|" /app/dist/index.html 2>/dev/null || \ |
| 31 | + sed "s|</head>|${CONFIG_SCRIPT}</head>|" /app/dist/index.html > /tmp/index.html.tmp 2>/dev/null && \ |
| 32 | + mv /tmp/index.html.tmp /app/dist/index.html 2>/dev/null; then |
| 33 | + echo "✓ 已插入配置脚本,VITE_API_BASE: ${VITE_API_BASE}" |
| 34 | + else |
| 35 | + echo "⚠ 警告: 配置注入失败,将使用构建时配置或默认值" |
| 36 | + fi |
| 37 | + fi |
| 38 | + else |
| 39 | + # 如果占位符不存在,检查是否已有配置脚本 |
| 40 | + if grep -q "__ROTE_CONFIG__" /app/dist/index.html 2>/dev/null; then |
| 41 | + # 如果已有配置脚本,尝试更新它 |
| 42 | + if sed -i "s|\"VITE_API_BASE\":\"[^\"]*\"|\"VITE_API_BASE\":\"${JSON_ESCAPED_API_BASE}\"|g" /app/dist/index.html 2>/dev/null || \ |
| 43 | + sed "s|\"VITE_API_BASE\":\"[^\"]*\"|\"VITE_API_BASE\":\"${JSON_ESCAPED_API_BASE}\"|g" /app/dist/index.html > /tmp/index.html.tmp 2>/dev/null && \ |
| 44 | + mv /tmp/index.html.tmp /app/dist/index.html 2>/dev/null; then |
| 45 | + echo "✓ 已更新配置脚本,VITE_API_BASE: ${VITE_API_BASE}" |
| 46 | + else |
| 47 | + echo "⚠ 警告: 配置脚本更新失败,将使用构建时配置或默认值" |
| 48 | + fi |
| 49 | + else |
| 50 | + # 如果既没有占位符也没有配置脚本,在 </head> 前插入配置脚本 |
| 51 | + CONFIG_SCRIPT="<script>window.__ROTE_CONFIG__=window.__ROTE_CONFIG__||{};window.__ROTE_CONFIG__.VITE_API_BASE=\"${JSON_ESCAPED_API_BASE}\";</script>" |
| 52 | + if sed -i "s|</head>|${CONFIG_SCRIPT}</head>|" /app/dist/index.html 2>/dev/null || \ |
| 53 | + sed "s|</head>|${CONFIG_SCRIPT}</head>|" /app/dist/index.html > /tmp/index.html.tmp 2>/dev/null && \ |
| 54 | + mv /tmp/index.html.tmp /app/dist/index.html 2>/dev/null; then |
| 55 | + echo "✓ 已插入配置脚本,VITE_API_BASE: ${VITE_API_BASE}" |
| 56 | + else |
| 57 | + echo "⚠ 警告: 配置注入失败,将使用构建时配置或默认值" |
| 58 | + fi |
| 59 | + fi |
| 60 | + fi |
| 61 | +else |
| 62 | + echo "⚠ 警告: /app/dist/index.html 不存在,跳过配置注入" |
| 63 | +fi |
| 64 | + |
| 65 | +# 执行原始命令(使用 set -e 确保命令失败时容器退出) |
| 66 | +set -e |
| 67 | +exec "$@" |
| 68 | + |
0 commit comments