File size: 4,062 Bytes
62660d6
3643eb2
6cec5c8
 
 
 
3643eb2
6cec5c8
 
 
 
ce46d6b
6cec5c8
 
 
 
 
 
 
 
 
 
 
62660d6
3e23d23
 
 
 
 
62660d6
 
ede55f3
 
 
6cec5c8
3e23d23
3643eb2
6cec5c8
62660d6
 
6cec5c8
 
62660d6
6cec5c8
 
62660d6
 
 
6cec5c8
 
 
 
 
62660d6
6cec5c8
 
 
 
 
 
 
 
62660d6
6cec5c8
 
 
62660d6
 
ce46d6b
6cec5c8
 
62660d6
 
3643eb2
6cec5c8
 
 
62660d6
 
3643eb2
6cec5c8
 
62660d6
 
ce46d6b
6cec5c8
 
62660d6
6cec5c8
 
62660d6
 
6cec5c8
 
62660d6
 
 
6cec5c8
 
 
 
62660d6
 
3643eb2
6cec5c8
 
62660d6
 
3643eb2
6cec5c8
 
62660d6
 
3643eb2
6cec5c8
 
 
62660d6
6cec5c8
62660d6
6cec5c8
 
3e23d23
3643eb2
 
 
6cec5c8
3643eb2
6cec5c8
 
 
 
3643eb2
 
 
ce46d6b
3643eb2
62660d6
ce46d6b
3643eb2
6cec5c8
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# HuggingFace Spaces 终极修复版 - 解决 echo 多行问题
FROM python:3.11-slim

# 避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
ENV PYTHONUNBUFFERED=1

# 设置工作目录
WORKDIR /app

# 安装基础依赖
RUN apt-get update && apt-get install -y \
    curl \
    wget \
    git \
    ca-certificates \
    gnupg \
    lsb-release \
    build-essential \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Node.js 22 安装 - 解决符号链接问题
RUN NODE_VERSION=22.11.0 \
    && curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" \
        -o node.tar.xz \
    && tar -xJf node.tar.xz -C /usr/local --strip-components=1 \
    && rm node.tar.xz \
    && printf "Node.js %s 安装完成\n系统自带 node: %s\n安装的 node: %s\n" \
        "${NODE_VERSION}" "$(which node 2>/dev/null || echo "未找到")" \
    && echo 'export PATH="/usr/local/bin:$PATH"' >> /etc/bash.bashrc \
    && echo 'export PATH="/usr/local/bin:$PATH"' >> /root/.bashrc \
    && ENV PATH="/usr/local/bin:$PATH"

# 升级 pip 到最新版本
RUN pip install --no-cache-dir --upgrade pip setuptools wheel

# 创建启动脚本 - 使用 printf 解决多行问题
RUN printf "#!/bin/bash\n\
set -e\n\
\n\
echo \"正在下载 airs_protocol 代码...\"\n\
\n\
# 克隆 airs_protocol 仓库到主目录\n\
if [ -d \"airs_protocol\" ]; then\n\
    echo \"清理旧代码...\"\n\
    rm -rf \"airs_protocol\"\n\
fi\n\
\n\
git clone -b master https://gitee.com/tanbushi/airs-protocol.git temp_airs\n\
\n\
# 只复制 airs_protocol 子目录的内容到主目录\n\
if [ -d \"temp_airs/airs_protocol\" ]; then\n\
    mkdir -p airs_protocol\n\
    cp -r temp_airs/airs_protocol/* airs_protocol/\n\
    cp -r temp_airs/airs_protocol/.[^.]* airs_protocol/ 2>/dev/null || true\n\
fi\n\
\n\
# 清理临时文件\n\
rm -rf temp_airs\n\
\n\
echo \"airs_protocol 代码下载完成\"\n\
ls -la airs_protocol/\n\
\n\
# 安装当前项目依赖\n\
if [ -f \"package.json\" ]; then\n\
    echo \"安装 Node.js 依赖...\"\n\
    /usr/local/bin/npm install\n\
fi\n\
\n\
if [ -f \"requirements.txt\" ]; then\n\
    echo \"安装 Python 依赖...\"\n\
    pip install --no-cache-dir -r requirements.txt\n\
fi\n\
\n\
# 安装 airs_protocol 依赖\n\
if [ -f \"airs_protocol/requirements.txt\" ]; then\n\
    echo \"安装 airs_protocol Python 依赖...\"\n\
    pip install --no-cache-dir -r airs_protocol/requirements.txt\n\
fi\n\
\n\
if [ -f \"airs_protocol/package.json\" ]; then\n\
    echo \"安装 airs_protocol Node.js 依赖...\"\n\
    /usr/local/bin/npm install\n\
fi\n\
\n\
echo \"环境准备完成,启动应用...\"\n\
\n\
# HuggingFace Spaces 启动逻辑\n\
if [ \\$# -gt 0 ]; then\n\
    exec \"\\$@\"\n\
else\n\
    # 优先级启动顺序\n\
    if [ -f \"package.json\" ]; then\n\
        if grep -q \"start\" package.json; then\n\
            echo \"使用 npm start 启动...\"\n\
            exec npm start\n\
        fi\n\
    fi\n\
    \n\
    if [ -f \"app.py\" ]; then\n\
        echo \"使用 python app.py 启动...\"\n\
        exec python app.py\n\
    fi\n\
    \n\
    if [ -f \"main.py\" ]; then\n\
        echo \"使用 python main.py 启动...\"\n\
        exec python main.py\n\
    fi\n\
    \n\
    if [ -f \"server.py\" ]; then\n\
        echo \"使用 python server.py 启动...\"\n\
        exec python server.py\n\
    fi\n\
    \n\
    # 默认保持运行,避免容器重启\n\
    echo \"未找到标准启动文件,保持容器运行...\"\n\
    sleep infinity\n\
fi\n" > /app/entrypoint.sh \
    && chmod +x /app/entrypoint.sh

# 创建非 root 用户
RUN useradd -m -u 1000 user \
    && chown -R user:user /app

# 复制项目文件
COPY --chown=user . .

# 暴露 HuggingFace Spaces 默认端口
EXPOSE 7860

# 切换到非 root 用户
USER user

# 设置环境变量 - 加载 Node.js 路径
ENV HOME=/home/user \
    PATH=/usr/local/bin:\$PATH \
    NODE_PATH=/usr/local/bin

# HuggingFace Spaces 会使用此 entrypoint
ENTRYPOINT ["/app/entrypoint.sh"]