Spaces:
Configuration error
Configuration error
# 多阶段构建 - 完整聊天应用Dockerfile | |
# 这个Dockerfile将前端和后端打包到一个容器中(可选方案) | |
# 阶段1: 构建前端 | |
FROM node:18-alpine as frontend-build | |
WORKDIR /app/client | |
# 复制前端package.json | |
COPY client/package*.json ./ | |
# 安装前端依赖 | |
RUN npm ci | |
# 复制前端源代码 | |
COPY client/ ./ | |
# 构建前端 | |
RUN npm run build | |
# 阶段2: 构建后端 | |
FROM node:18-alpine as backend-build | |
WORKDIR /app/server | |
# 复制后端package.json | |
COPY server/package*.json ./ | |
# 安装后端依赖 | |
RUN npm ci --only=production | |
# 复制后端源代码 | |
COPY server/ ./ | |
# 阶段3: 生产环境 | |
FROM node:18-alpine | |
# 安装必要的系统依赖 | |
RUN apk add --no-cache \ | |
nginx \ | |
wget \ | |
curl \ | |
supervisor \ | |
&& rm -rf /var/cache/apk/* | |
# 创建应用用户 | |
RUN addgroup -g 1001 -S appuser && \ | |
adduser -S appuser -u 1001 | |
# 设置工作目录 | |
WORKDIR /app | |
# 复制后端文件 | |
COPY --from=backend-build --chown=appuser:appuser /app/server ./server | |
# 复制前端构建文件 | |
COPY --from=frontend-build --chown=appuser:appuser /app/client/dist ./client/dist | |
# 创建nginx配置 | |
RUN mkdir -p /etc/nginx/conf.d | |
COPY --chown=appuser:appuser client/nginx.conf /etc/nginx/conf.d/default.conf | |
# 创建supervisor配置 | |
RUN mkdir -p /etc/supervisor/conf.d | |
COPY --chown=appuser:appuser <<EOF /etc/supervisor/conf.d/supervisord.conf | |
[supervisord] | |
nodaemon=true | |
user=root | |
logfile=/var/log/supervisor/supervisord.log | |
pidfile=/var/run/supervisord.pid | |
[program:nginx] | |
command=nginx -g "daemon off;" | |
autostart=true | |
autorestart=true | |
stderr_logfile=/var/log/nginx/error.log | |
stdout_logfile=/var/log/nginx/access.log | |
user=appuser | |
[program:node] | |
command=node server/index.js | |
directory=/app | |
autostart=true | |
autorestart=true | |
stderr_logfile=/var/log/node/error.log | |
stdout_logfile=/var/log/node/access.log | |
user=appuser | |
environment=NODE_ENV=production | |
EOF | |
# 创建日志目录 | |
RUN mkdir -p /var/log/nginx /var/log/node /var/log/supervisor && \ | |
chown -R appuser:appuser /var/log/nginx /var/log/node /var/log/supervisor | |
# 修改nginx配置以适应单容器部署 | |
RUN sed -i 's/proxy_pass http:\/\/localhost:5000/proxy_pass http:\/\/127.0.0.1:5000/g' /etc/nginx/conf.d/default.conf | |
# 暴露端口 | |
EXPOSE 80 5000 | |
# 环境变量 | |
ENV NODE_ENV=production | |
ENV PORT=5000 | |
ENV MONGODB_URI=mongodb://mongo:27017/chatapp | |
# 健康检查 | |
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ | |
CMD wget --no-verbose --tries=1 --spider http://localhost:80 && \ | |
wget --no-verbose --tries=1 --spider http://localhost:5000/api/health || exit 1 | |
# 切换到应用用户 | |
USER appuser | |
# 启动supervisor | |
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] | |