File size: 1,965 Bytes
6c7338b
f0e18a2
c79782b
f0e18a2
fff456b
0f2d026
f0e18a2
 
 
 
 
c79782b
6c7338b
 
 
 
 
 
 
c79782b
6c7338b
c79782b
55285aa
0f2d026
6c7338b
55285aa
6c7338b
 
55285aa
6c7338b
f7728bf
0f2d026
55285aa
6c7338b
f7728bf
 
81805a2
 
55285aa
81805a2
 
 
 
 
f7728bf
496b622
6c7338b
0f2d026
55285aa
 
 
6c7338b
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
# ----------  1. 基础镜像 ----------
FROM node:20

# ----------  2. 系统级依赖 ----------
RUN apt-get update && apt-get install -y git curl cron && rm -rf /var/lib/apt/lists/*

# ----------  3. 创建非 root 用户 ----------
RUN groupadd -r -g 1001 opencode && \
    useradd -r -g opencode -u 1001 opencode && \
    mkdir -p /home/opencode && \
    chown opencode:opencode /home/opencode

# ----------  5. 全局安装 opencode-ai ----------
#    安装完先验证二进制是否存在,若不存在就手动解压
RUN npm install -g opencode-ai@latest && \
    if [ ! -f /usr/local/lib/node_modules/opencode-ai/node_modules/opencode-linux-x64/bin/opencode ]; then \
        cd /usr/local/lib/node_modules/opencode-ai && \
        npm run postinstall; \
    fi

# ---------- 6. 工作目录 ----------
WORKDIR /app
COPY --chown=opencode:opencode package*.json ./
COPY --chown=opencode:opencode . /app
RUN if [ -f package.json ]; then npm ci --only=production; fi

# ---------- 7. 修正权限 ----------
RUN chown -R opencode:opencode /app /home/opencode

# ---------- 8. 启动脚本 ----------
USER root
RUN mkdir -p /home/opencode/.local/bin
RUN printf '#!/bin/sh\n\
echo "Starting OpenCode AI Web Server ..."\n\
# 启动 cron 服务\n\
service cron start\n\
# 切换到 opencode 用户启动应用\n\
exec su - opencode -c "/home/opencode/.local/bin/start-opencode.sh"\n' > /home/opencode/.local/bin/start.sh && \
    chmod +x /home/opencode/.local/bin/start.sh

RUN printf '#!/bin/sh\n\
echo "Starting opencode serve..."\n\
exec /usr/local/bin/opencode serve --hostname 0.0.0.0 --port 7860\n' > /home/opencode/.local/bin/start-opencode.sh && \
    chmod +x /home/opencode/.local/bin/start-opencode.sh
USER opencode

# ---------- 9. 端口与健康检查 ----------
EXPOSE 7860
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:7860/health || exit 1

CMD ["/home/opencode/.local/bin/start.sh"]