-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
94 lines (75 loc) · 3.05 KB
/
Dockerfile
File metadata and controls
94 lines (75 loc) · 3.05 KB
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
# Dockerfile
# --- 构建阶段 ---
FROM node:18-alpine AS builder
LABEL maintainer="Your Name <your.email@example.com>"
LABEL version="1.1.0"
LABEL description="Media Processing Service API"
WORKDIR /usr/src/app
# Alpine Linux 需要为 Sharp 和 FFmpeg 安装一些依赖
# vips-dev: Sharp 的核心依赖 libvips
# fftw-dev: FFmpeg 的某些功能可能需要
# build-base, gcc, g++, python3: 用于编译原生 Node.js 模块
# ffmpeg: FFmpeg 主程序
# fontconfig 和字体包: 如果需要水印功能,服务器上必须有字体
RUN apk add --no-cache \
build-base \
gcc \
g++ \
python3 \
vips-dev \
fftw-dev \
ffmpeg \
fontconfig \
ttf-dejavu \
msttcorefonts-installer \
&& update-ms-fonts && fc-cache -f -v # 安装微软核心字体并刷新字体缓存
# 拷贝 package.json 和 package-lock.json (或 yarn.lock)
COPY package*.json ./
# 安装生产依赖
# --arch=x64 --platform=linux 是为了帮助在某些CI/CD环境或交叉编译场景下正确构建原生模块
# 对于 Alpine (musl libc), Sharp 可能需要这些标志。如果直接在 Alpine 构建,可能不是必须的。
RUN npm install --only=production --arch=x64 --platform=linux
# 拷贝所有应用代码
COPY . .
# 如果有构建步骤 (例如 TypeScript -> JavaScript),在这里执行
# RUN npm run build
# --- 生产阶段 ---
FROM node:18-alpine AS production-stage
WORKDIR /usr/src/app
# 从 builder 阶段拷贝必要的运行时依赖
# FFmpeg 和 Vips (非 -dev 包) 是运行时需要的
# 字体相关的包也需要在运行时存在
RUN apk add --no-cache \
vips \
ffmpeg \
fftw \
fontconfig \
ttf-dejavu \
msttcorefonts-installer \
&& update-ms-fonts && fc-cache -f -v
# 拷贝 node_modules
COPY --from=builder /usr/src/app/node_modules ./node_modules
# 拷贝 package.json (某些库可能在运行时需要它)
COPY --from=builder /usr/src/app/package*.json ./
# 拷贝应用代码 (如果是构建项目,这里拷贝 dist 目录)
COPY --from=builder /usr/src/app/config ./config
COPY --from=builder /usr/src/app/src ./src
COPY --from=builder /usr/src/app/public ./public
COPY --from=builder /usr/src/app/server.js ./server.js
# 创建应用运行时需要的目录 (这些目录的数据应该通过卷挂载)
# 注意:original_media 如果是应用自带的,应该从 builder 阶段 COPY 进来
# COPY --from=builder /usr/src/app/original_media ./original_media
RUN mkdir -p ./original_media/images ./original_media/videos \
./uploaded_media/images ./uploaded_media/videos \
./cached_outputs \
./temp_video_outputs
# 暴露应用监听的端口 (与 config/index.js 中的 port 一致)
EXPOSE 3000
# 设置环境变量 (也可以在 docker run 或 docker-compose 中设置)
ENV NODE_ENV=production
# PORT 通常在运行时通过 -p <host_port>:<container_port> 或 docker-compose ports 设置
# 创建一个非 root 用户来运行应用,增强安全性
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# 默认启动命令
CMD [ "node", "server.js" ]