汉化langfuse踩坑记录--docker卷挂载未生效问题修复及langfuse启动
本次对langfuse项目镜像进行汉化的这个过程中,遇到的主要困难都围绕着一个核心问题:在网络环境不稳定的情况下,如何成功构建一个依赖外部资源和复杂构建流程的 Docker 镜像,并应用代码修改。
一,docker源代码挂载未生效,汉化代码未生效问题。
在更新源代码为汉化版本并挂载到docker容器下后,发现即使挂载卷成功挂载到容器下,前端页面打开后依旧是未更新状态。后续即使清除docker 缓存后重新构建docker容器也依旧为生效。
原因就在于:
Langfuse 的前端应用 (langfuse-web) 是一个 Next.js 应用。Next.js 应用在生产环境中运行时,它提供的是编译和打包后的静态文件和服务器端渲染的页面。这些编译产物 (.next/standalone, .next/static 等) 是在 Docker 镜像的 构建阶段 (builder 阶段的 turbo run build 命令) 生成的。
当首次启动 Langfuse 时,使用的是官方镜像。这个镜像里面包含的是那个时候编译好的前端代码。
后面尝试的 volumes: - ./web/src:/app/web/src 挂载,确实让容器内部的 /app/web/src 目录与宿主机上的源代码目录实时同步了。但是,正在运行的 Next.js 服务器并不会实时监控这个源代码目录的变化,并自动重新编译和加载。 它加载的是它在镜像构建时就打包好的那些静态文件和服务器端逻辑。
所以,容器内 /app/web/src 目录的源代码是更新后的代码,但 langfuse-web 容器中运行的 Next.js 应用程序实例,实际上加载和展示的是位于它**自身内部(在构建时就已打包进去)**的旧的、未汉化的编译产物。
解决方案:
- 修改
docker-compose.yml
: 将langfuse-web
服务的image
指令替换为build
指令,并指向正确的Dockerfile
路径(context: .
,dockerfile: ./web/Dockerfile
)。 - 强制重建镜像: 每次修改代码后,执行
docker compose -p langfuse_cn build --no-cache langfuse-web
,强制 Docker 重新编译你的修改,并生成新的镜像。 - 重新启动服务:
docker compose -p langfuse_cn up -d
,使用新构建的镜像启动容器。
二,构建项目过程中的报错记录及排查:
1. 在下载 pnpm@9.5.0 时遇到网络问题错误:
Error when performing the request to https://registry.npmjs.org/pnpm/-/pnpm-9.5.0.tgz
这表明 Docker 容器无法从 npm 官方仓库下载 pnpm 包
解决方法:替换 npm 镜像源
package.json 是 JavaScript/Node.js 项目的核心配置文件,主要用于管理项目的元数据、依赖关系和脚本命令。
在dockerfile中执行npm run,npm run build
等命令时,会从该文件下下载依赖包。
在 Dockerfile 中执行 corepack prepare 前添加以下命令:
RUN npm config set registry https://registry.npmmirror.com
2.解决 Prisma 二进制下载失败问题(ECONNRESET 错误)
该错误表明在构建过程中 Prisma 引擎二进制文件下载失败,核心原因是网络连接被重置(ECONNRESET)。
Error: request to https://binaries.prisma.sh/all_commits/acc0b9dd43eb689cbd20c9470515d719db10d0b0/linux-musl-openssl-3.0.x/query-engine.gz.sha256 failed, reason: read ECONNRESET
使用淘宝镜像源,修改 Dockerfile,在 RUN turbo run build 前添加:
ENV PRISMA_BINARIES_MIRROR="https://npmmirror.com/mirrors/prisma"
RUN NODE_OPTIONS='--max-old-space-size=8192' turbo run build
3.解决国内镜像源下载文件不完整,导致文件后续解压失败问题:
报错日志:
ERROR [langfuse-web runner 7/17] RUN MIGRATE_TARGET_ARCH=$(echo linux/amd64 | sed 's/\//-/g') && wget -q -O- https://github.com/golang-migrate/migrate/releases/download/v4.18.2/migrate.$MIGRATE_TARGET_ 131.3s
先手动前往官网下载文件,访问 golang-migrate 的 GitHub Releases 页面。
下载:https://github.com/golang-migrate/migrate/releases/download/v4.18.2/migrate.darwin-amd64.tar.gz
下载完成后,将文件保存到dockerfile同级目录下,执行
tar xvzf migrate.$MIGRATE_TARGET_ARCH.tar.gz
然后将web/dockerfile文件中的:
RUN MIGRATE_TARGET_ARCH=$(echo ${TARGETPLATFORM:-linux/amd64} | sed 's/\//-/g') && \wget -q -O- https://ghproxy.com/https://github.com/golang-migrate/migrate/releases/download/v4.18.2/migrate.$MIGRATE_TARGET_ARCH.tar.gz | tar xvz && \mv migrate /usr/bin/migrate
替换为:
COPY web/migrate /usr/bin/migrate
RUN chmod +x /usr/bin/migrate
4. 使用国内镜像源(推荐)
# 在RUN turbo run build前添加
ENV PRISMA_BINARIES_MIRROR="https://npmmirror.com/mirrors/prisma"
RUN NODE_OPTIONS='--max-old-space-size=8192' turbo run build --filter=web...
5. 通过源代码构建容器
注意每次构建前清理缓存避免干扰:
docker builder prune -af
docker build --no-cache .