Dockerfile位于根目录子文件夹时如何正确指向package.json
Docker Compose构建报错找不到package.json的解决方法
目录结构
root/ package.json app.js docker/ backend.Dockerfile docker-compose.yaml
报错信息
> [4/4] RUN npm install: #8 0.564 npm ERR! code ENOENT #8 0.565 npm ERR! syscall open #8 0.565 npm ERR! path /usr/src/app/package.json #8 0.565 npm ERR! errno -2 #8 0.566 npm ERR! enoent ENOENT: no such file or directory, open '/usr/src/app/package.json' #8 0.566 npm ERR! enoent This is related to npm not being able to find a file. #8 0.566 npm ERR! enoent #8 0.567 #8 0.567 npm ERR! A complete log of this run can be found in: #8 0.567 npm ERR! /root/.npm/_logs/2022-12-27T09_15_42_645Z-debug-0.log
当前配置文件
backend.Dockerfile
FROM node:18 WORKDIR /app COPY ../ . RUN npm install EXPOSE 8000 CMD ["npm", "run", "dev"]
docker-compose.yaml
version: '3' services: app: build: context: . dockerfile: backend.Dockerfile volumes: - ../:/app:cached ports: - "8000:8000"
问题原因
Docker构建时有上下文路径限制:构建过程只能访问上下文路径范围内的文件,无法访问上下文之外的目录。你当前在docker目录下运行docker-compose,build.context设为.(即docker目录),此时Dockerfile里的COPY ../ .试图访问上下文之外的root目录,这是Docker不允许的操作,导致复制失败后找不到package.json。
解决步骤
- 修改docker-compose.yaml的构建上下文
将build.context改为../(根目录),同时指定Dockerfile的完整相对路径:
version: '3' services: app: build: context: ../ dockerfile: docker/backend.Dockerfile volumes: - ../:/app:cached ports: - "8000:8000"
- 修改Dockerfile的COPY命令
此时构建上下文是根目录,直接复制上下文内的所有文件到容器的/app目录即可:
FROM node:18 WORKDIR /app COPY . . RUN npm install EXPOSE 8000 CMD ["npm", "run", "dev"]
修改完成后,构建时Docker就能正确获取根目录下的package.json,npm install可正常执行。
内容的提问来源于stack exchange,提问作者Unamed
相关产品推荐
相关产品推荐

