Update Dockerfile
Browse files- Dockerfile +71 -22
Dockerfile
CHANGED
@@ -1,36 +1,85 @@
|
|
1 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
FROM blinkospace/blinko:latest
|
3 |
|
|
|
|
|
|
|
4 |
# --- 关键: 确定运行应用的用户和组 ---
|
5 |
-
#
|
6 |
-
#
|
7 |
-
# 或者在容器运行时通过 `whoami` 和 `id` 查看。
|
8 |
-
# 假设是 'node':'node' (这是一个常见的 Node.js 镜像用户,请根据实际情况修改!)
|
9 |
ARG APP_USER=node
|
10 |
ARG APP_GROUP=node
|
11 |
-
#
|
12 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
14 |
-
# ---
|
15 |
-
#
|
16 |
-
# 2. (可选但推荐) 确保运行应用的用户拥有该目录权限
|
17 |
-
# 3. 创建从 /app/.blinko 指向目标目录的符号链接
|
18 |
RUN mkdir -p /tmp/.blinko && \
|
19 |
chown ${APP_USER}:${APP_GROUP} /tmp/.blinko && \
|
20 |
-
ln -s /tmp/.blinko
|
|
|
21 |
|
22 |
-
#
|
23 |
EXPOSE 1111
|
24 |
|
25 |
-
#
|
26 |
# USER ${APP_USER}
|
27 |
|
28 |
-
#
|
29 |
-
#
|
30 |
-
# 或者覆盖它。根据你的日志,它似乎是启动一个 Next.js 应用。
|
31 |
-
# 你可能需要保留基础镜像的 CMD 或 ENTRYPOINT,或者提供你自己的。
|
32 |
-
# 例如 (只是猜测,你需要确认!):
|
33 |
CMD ["node", ".next/standalone/server.js"]
|
34 |
-
# 或者如果它有 package.json 脚本:
|
35 |
-
# CMD ["npm", "run", "start"]
|
36 |
-
# 或者保留基础镜像的默认命令 (如果它设置了的话)
|
|
|
1 |
+
# --- Stage 1: Builder ---
|
2 |
+
# 使用一个包含 Node.js 和构建工具的基础镜像
|
3 |
+
# 选择一个与你项目兼容的 Node.js 版本 (例如: 18, 20)
|
4 |
+
FROM node:20-alpine AS builder
|
5 |
+
|
6 |
+
# 设置工作目录
|
7 |
+
WORKDIR /app
|
8 |
+
|
9 |
+
# 复制 package.json 和 lock 文件
|
10 |
+
COPY package*.json ./
|
11 |
+
# 如果使用 yarn 或 pnpm,复制相应的文件 (yarn.lock, pnpm-lock.yaml)
|
12 |
+
# COPY yarn.lock ./
|
13 |
+
# COPY pnpm-lock.yaml ./
|
14 |
+
|
15 |
+
# 安装依赖项 (生产环境依赖和开发依赖,因为需要构建)
|
16 |
+
# 使用 'ci' 或 '--frozen-lockfile' 来确保一致性
|
17 |
+
RUN npm ci
|
18 |
+
# 或者: RUN yarn install --frozen-lockfile
|
19 |
+
# 或者: RUN pnpm install --frozen-lockfile
|
20 |
+
|
21 |
+
# 复制 Prisma schema
|
22 |
+
# 假设你的 prisma 目录在项目根目录下
|
23 |
+
COPY prisma ./prisma/
|
24 |
+
|
25 |
+
# (可选但推荐) 生成 Prisma Client - Next.js build 可能也会触发这个
|
26 |
+
RUN npx prisma generate
|
27 |
+
|
28 |
+
# 复制所有源代码到构建阶段
|
29 |
+
COPY . .
|
30 |
+
|
31 |
+
# 构建 Next.js 应用
|
32 |
+
# 确保你的 next.config.js 中设置了 output: 'standalone'
|
33 |
+
# 例如:
|
34 |
+
# const nextConfig = {
|
35 |
+
# output: 'standalone',
|
36 |
+
# // ...其他配置
|
37 |
+
# };
|
38 |
+
RUN npm run build
|
39 |
+
# 或者: RUN yarn build
|
40 |
+
# 或者: RUN pnpm build
|
41 |
+
|
42 |
+
|
43 |
+
# --- Stage 2: Runner ---
|
44 |
+
# 使用你指定的 blinkospace/blinko:latest 镜像作为最终运行环境
|
45 |
+
# 假设这个镜像提供了 Node.js 运行时和其他必要的环境
|
46 |
FROM blinkospace/blinko:latest
|
47 |
|
48 |
+
# 设置工作目录 (确保与启动命令中的路径一致)
|
49 |
+
WORKDIR /app
|
50 |
+
|
51 |
# --- 关键: 确定运行应用的用户和组 ---
|
52 |
+
# 检查 blinkospace/blinko:latest 是否设置了默认用户。
|
53 |
+
# 如果没有,或者你想指定,可以设置。假设是 'node':'node' (常见,需确认!)
|
|
|
|
|
54 |
ARG APP_USER=node
|
55 |
ARG APP_GROUP=node
|
56 |
+
# 如果 blinko 镜像没有 node 用户/组,你可能需要选择它提供的用户,
|
57 |
+
# 或者在上面 builder 阶段之后,这里添加 RUN groupadd... useradd...
|
58 |
+
# 如果应用必须以 root 运行 (不推荐),则 chown 可能不需要,但链接仍需创建
|
59 |
+
|
60 |
+
# 从 builder 阶段复制构建产物
|
61 |
+
# 1. Standalone server and dependencies
|
62 |
+
COPY --from=builder /app/.next/standalone ./
|
63 |
+
# 2. Static assets
|
64 |
+
COPY --from=builder /app/.next/static ./.next/static
|
65 |
+
# 3. Public assets
|
66 |
+
COPY --from=builder /app/public ./public
|
67 |
+
# 4. Prisma schema and migrations (可能运行时需要,例如检查或应用迁移)
|
68 |
+
COPY --from=builder /app/prisma ./prisma/
|
69 |
|
70 |
+
# --- 创建符号链接以解决 .blinko 权限问题 ---
|
71 |
+
# 将 /app/.blinko 指向 /tmp/.blinko (临时存储)
|
|
|
|
|
72 |
RUN mkdir -p /tmp/.blinko && \
|
73 |
chown ${APP_USER}:${APP_GROUP} /tmp/.blinko && \
|
74 |
+
ln -s /tmp/.blinko ./.blinko
|
75 |
+
# 注意: 这里使用了相对路径 ./.blinko 因为 WORKDIR 是 /app
|
76 |
|
77 |
+
# 暴露应用程序端口
|
78 |
EXPOSE 1111
|
79 |
|
80 |
+
# (可选) 设置运行用户 (如果不想用 root)
|
81 |
# USER ${APP_USER}
|
82 |
|
83 |
+
# 设置容器启动时执行的命令
|
84 |
+
# 这应该匹配 Next.js standalone 模式的入口点
|
|
|
|
|
|
|
85 |
CMD ["node", ".next/standalone/server.js"]
|
|
|
|
|
|