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