Browse Source
- 新增 .dockerignore 文件,定义 Docker 构建时忽略的文件和目录 - 更新 Dockerfile,采用多阶段构建,优化依赖安装和应用代码复制 - 新增 docker-compose.yml 文件,配置应用和数据库服务,设置健康检查和环境变量 - 设定容器重启策略,挂载数据库和日志目录feat/collect
3 changed files with 187 additions and 16 deletions
@ -0,0 +1,90 @@ |
|||||
|
# 依赖目录 |
||||
|
node_modules |
||||
|
npm-debug.log* |
||||
|
yarn-debug.log* |
||||
|
yarn-error.log* |
||||
|
|
||||
|
# 运行时文件 |
||||
|
*.pid |
||||
|
*.seed |
||||
|
*.pid.lock |
||||
|
|
||||
|
# 覆盖率目录 |
||||
|
coverage |
||||
|
*.lcov |
||||
|
|
||||
|
# nyc测试覆盖率 |
||||
|
.nyc_output |
||||
|
|
||||
|
# 依赖锁定文件(在Dockerfile中会复制) |
||||
|
# package-lock.json |
||||
|
# yarn.lock |
||||
|
|
||||
|
# 日志文件 |
||||
|
logs |
||||
|
*.log |
||||
|
|
||||
|
# 运行时数据 |
||||
|
pids |
||||
|
*.pid |
||||
|
*.seed |
||||
|
*.pid.lock |
||||
|
|
||||
|
# 目录 |
||||
|
.npm |
||||
|
.eslintcache |
||||
|
|
||||
|
# 可选npm缓存目录 |
||||
|
.npm |
||||
|
|
||||
|
# 可选REPL历史 |
||||
|
.node_repl_history |
||||
|
|
||||
|
# 输出目录 |
||||
|
dist |
||||
|
build |
||||
|
|
||||
|
# 环境变量文件 |
||||
|
.env |
||||
|
.env.local |
||||
|
.env.development.local |
||||
|
.env.test.local |
||||
|
.env.production.local |
||||
|
|
||||
|
# IDE文件 |
||||
|
.vscode |
||||
|
.idea |
||||
|
*.swp |
||||
|
*.swo |
||||
|
|
||||
|
# 操作系统文件 |
||||
|
.DS_Store |
||||
|
Thumbs.db |
||||
|
|
||||
|
# Git文件 |
||||
|
.git |
||||
|
.gitignore |
||||
|
|
||||
|
# Docker文件 |
||||
|
Dockerfile* |
||||
|
docker-compose* |
||||
|
.dockerignore |
||||
|
|
||||
|
# 测试文件 |
||||
|
test |
||||
|
tests |
||||
|
__tests__ |
||||
|
*.test.js |
||||
|
*.spec.js |
||||
|
|
||||
|
# 文档 |
||||
|
README.md |
||||
|
CHANGELOG.md |
||||
|
docs |
||||
|
|
||||
|
# 其他 |
||||
|
*.md |
||||
|
.editorconfig |
||||
|
.eslintrc* |
||||
|
.prettierrc* |
||||
|
.babelrc* |
@ -1,29 +1,64 @@ |
|||||
# 使用官方 Bun 运行时的轻量级镜像 |
# 多阶段构建 - 构建阶段 |
||||
FROM oven/bun:alpine as base |
FROM oven/bun:alpine AS builder |
||||
|
|
||||
WORKDIR /app |
WORKDIR /app |
||||
|
|
||||
# 仅复制生产依赖相关文件 |
# 复制依赖文件 |
||||
COPY package.json bun.lockb knexfile.mjs .npmrc ./ |
COPY package.json bun.lockb ./ |
||||
|
|
||||
# 安装依赖(生产环境) |
# 安装所有依赖(包括开发依赖) |
||||
RUN bun install --production |
RUN bun install --frozen-lockfile |
||||
|
|
||||
# 复制应用代码和静态资源 |
# 复制源代码 |
||||
COPY src ./src |
COPY . . |
||||
COPY public ./public |
|
||||
|
|
||||
COPY entrypoint.sh ./entrypoint.sh |
# 构建阶段(如果需要) |
||||
|
RUN bun run build || true |
||||
|
|
||||
|
# 生产阶段 |
||||
|
FROM oven/bun:alpine AS production |
||||
|
|
||||
|
# 创建非root用户 |
||||
|
RUN addgroup -g 1001 -S nodejs && \ |
||||
|
adduser -S bun -u 1001 |
||||
|
|
||||
|
WORKDIR /app |
||||
|
|
||||
|
# 从构建阶段复制依赖 |
||||
|
COPY --from=builder --chown=bun:nodejs /app/node_modules ./node_modules |
||||
|
COPY --from=builder --chown=bun:nodejs /app/package.json ./ |
||||
|
COPY --from=builder --chown=bun:nodejs /app/bun.lockb ./ |
||||
|
COPY --from=builder --chown=bun:nodejs /app/knexfile.mjs ./ |
||||
|
|
||||
|
# 复制应用代码 |
||||
|
COPY --from=builder --chown=bun:nodejs /app/src ./src |
||||
|
COPY --from=builder --chown=bun:nodejs /app/public ./public |
||||
|
|
||||
|
# 复制并设置入口脚本权限 |
||||
|
COPY --chown=bun:nodejs entrypoint.sh ./entrypoint.sh |
||||
RUN chmod +x ./entrypoint.sh |
RUN chmod +x ./entrypoint.sh |
||||
|
|
||||
# 如需数据库文件(如 SQLite),可挂载到宿主机 |
# 创建必要的目录并设置权限 |
||||
VOLUME /app/database |
RUN mkdir -p /app/database /app/logs && \ |
||||
|
chown -R bun:nodejs /app/database /app/logs |
||||
|
|
||||
# 启动命令(如有端口需求可暴露端口) |
# 设置环境变量 |
||||
|
ENV NODE_ENV=production |
||||
|
ENV BUN_ENV=production |
||||
|
ENV PORT=3000 |
||||
|
|
||||
|
# 暴露端口 |
||||
EXPOSE 3000 |
EXPOSE 3000 |
||||
|
|
||||
# 健康检查:每30秒检查一次服务端口,3次失败则容器为unhealthy |
# 切换到非root用户 |
||||
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ |
USER bun |
||||
CMD wget --spider -q http://localhost:3000/ || exit 1 |
|
||||
|
# 健康检查优化 |
||||
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ |
||||
|
CMD bun --version && \ |
||||
|
(wget --spider -q http://localhost:3000/health || \ |
||||
|
wget --spider -q http://localhost:3000/ || \ |
||||
|
exit 1) |
||||
|
|
||||
|
# 设置入口点 |
||||
ENTRYPOINT ["./entrypoint.sh"] |
ENTRYPOINT ["./entrypoint.sh"] |
||||
|
@ -0,0 +1,46 @@ |
|||||
|
version: '3.8' |
||||
|
|
||||
|
services: |
||||
|
app: |
||||
|
build: |
||||
|
context: . |
||||
|
dockerfile: Dockerfile |
||||
|
target: production |
||||
|
container_name: koa3-demo-app |
||||
|
restart: unless-stopped |
||||
|
ports: |
||||
|
- "3000:3000" |
||||
|
environment: |
||||
|
- NODE_ENV=production |
||||
|
- BUN_ENV=production |
||||
|
- PORT=3000 |
||||
|
volumes: |
||||
|
- ./database:/app/database |
||||
|
- ./logs:/app/logs |
||||
|
networks: |
||||
|
- app-network |
||||
|
healthcheck: |
||||
|
test: ["CMD", "bun", "--version"] |
||||
|
interval: 30s |
||||
|
timeout: 10s |
||||
|
retries: 3 |
||||
|
start_period: 40s |
||||
|
depends_on: |
||||
|
- db |
||||
|
|
||||
|
db: |
||||
|
image: sqlite:latest |
||||
|
container_name: koa3-demo-db |
||||
|
restart: unless-stopped |
||||
|
volumes: |
||||
|
- ./database:/var/lib/sqlite |
||||
|
networks: |
||||
|
- app-network |
||||
|
|
||||
|
networks: |
||||
|
app-network: |
||||
|
driver: bridge |
||||
|
|
||||
|
volumes: |
||||
|
database: |
||||
|
logs: |
Loading…
Reference in new issue