Dockerfile中RUN指令无法执行npx、node命令问题排查求助
问题根因
你遇到的问题核心是docker-compose的挂载配置覆盖了镜像构建阶段生成的文件:
- 构建镜像时,Dockerfile里的RUN指令确实已经正常执行,在镜像内部的
/usr/src/app/src/gql/路径下生成了generate-typings.js文件 - 容器启动时,你配置的
./src:/usr/src/app/src绑定挂载会把本地的src目录直接覆盖容器内的对应路径,本地src目录没有生成好的generate-typings.js,因此容器内看不到该文件 - 手动进入容器执行脚本正常,是因为执行时挂载已经完成,新生成的文件会同时写入本地
src和容器内路径,因此可以正常访问
解决方案
你可以根据自己的使用场景选择以下任意一种方案:
- 调整挂载规则,排除构建生成文件的路径:在
docker-compose.yml的volumes配置中新增匿名卷,避免生成目录被本地挂载覆盖,修改后配置如下:volumes: - ./src:/usr/src/app/src - /usr/src/app/src/gql/ # 新增这行,该目录不会被本地挂载覆盖 - 将类型生成逻辑移到容器启动阶段执行:修改
package.json中的dev脚本,把生成命令加到启动逻辑前,示例如下:
每次容器启动时会自动执行生成逻辑,无需依赖构建阶段的输出。"scripts": { "dev": "tsc --skipLibCheck src/gql/generate-typings.ts && node src/gql/generate-typings.js && npm run start:watch" } - 本地提前执行生成命令:开发前先在本地手动执行一遍
tsc --skipLibCheck src/gql/generate-typings.ts和node src/gql/generate-typings.js,生成的文件会保存在本地src目录,挂载时自然同步到容器内。
额外注意项
检查你的Dockerfile中存在笔误:RUN npx - tsc --skipLibCheck /usr/src/app/src/gql/generate-typings.ts里npx后面多了一个多余的横杠,该参数会导致tsc执行异常,建议修正为RUN npx tsc --skipLibCheck /usr/src/app/src/gql/generate-typings.ts,避免构建阶段实际执行失败。
内容的提问来源于stack exchange,提问作者adeniran827
相关产品推荐
相关产品推荐

