Docker无法找到复制文件:前后端容器启动失败求助
尝试运行前后端多个Docker容器,但容器启动失败,Docker提示找不到后端的manage.py文件和前端的package.json文件,已尝试多种同类问题解决方案仍未解决。
文件夹结构
- docker-compose.yml - frontend/ - Dockerfile - package.json - node项目文件... - backend/ - Dockerfile - manage.py -更多Django项目文件...
配置文件
docker-compose.yml
version: '3.4' services: backend: build: context: ./backend dockerfile: Dockerfile container_name: 'backend' command: python manage.py runserver 0.0.0.0:8080 volumes: - ./data/backend:/backend_app ports: - '8080:8080' restart: always frontend: image: node:18.14.2 build: context: ./frontend dockerfile: Dockerfile container_name: 'frontend' command: npm run preview ports: - '3000:3000' volumes: - ./data/frontend:/frontend_app
frontend/Dockerfile
FROM node:18.14.2 EXPOSE 3000 WORKDIR /frontend_app COPY package*.json ./ RUN npm install COPY . . CMD ["npm", "run", "preview"]
backend/Dockerfile
FROM python:3.10-slim EXPOSE 8080 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /backend_app COPY requirements.txt . RUN python -m pip install --upgrade pip RUN python -m pip install -r requirements.txt COPY . . CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]
错误日志
运行docker compose up时的部分控制台输出:
frontend | npm frontend | ERR! code ENOENT frontend | npm ERR! syscall open frontend | npm ERR! path /frontend_app/package.json frontend | npm frontend | ERR! errno -2 frontend | npm ERR! enoent ENOENT: no such file or directory, open '/frontend_app/package.json' frontend | npm ERR! enoent This is related to npm not being able to find a file. frontend | npm ERR! enoent frontend | frontend | frontend | npm ERR! A complete log of this run can be found in: frontend | npm ERR! /root/.npm/_logs/2023-07-17T22_35_21_039Z-debug-0.log backend | python: can't open file '/backend_app/manage.py': [Errno 2] No such file or directory backend exited with code 2
解决方案
核心问题是docker-compose中的volumes挂载覆盖了容器内的工作目录:
你的Dockerfile已经通过COPY . .将项目文件复制到容器的/backend_app和/frontend_app目录,但docker-compose里配置的volumes将本地的./data/backend挂载到/backend_app,./data/frontend挂载到/frontend_app。如果本地的./data/backend和./data/frontend目录为空或没有对应的manage.py、package.json文件,挂载后容器内原有的文件会被覆盖,导致找不到目标文件。
解决方法1:移除不必要的挂载(推荐,适合生产环境)
如果不需要本地代码与容器实时同步,直接删除docker-compose.yml中的volumes配置:
修改后的docker-compose.yml:
version: '3.4' services: backend: build: context: ./backend dockerfile: Dockerfile container_name: 'backend' command: python manage.py runserver 0.0.0.0:8080 ports: - '8080:8080' restart: always frontend: build: context: ./frontend dockerfile: Dockerfile container_name: 'frontend' command: npm run preview ports: - '3000:3000'
解决方法2:保留挂载但确保本地目录有对应文件(适合开发环境热更新)
如果需要本地代码修改后同步到容器,先确保本地./data/backend和./data/frontend目录存在,并且将后端的manage.py、前端的package.json等项目文件复制到对应的本地目录中,再重新运行docker compose up。
解决方法3:使用bind mount同步代码(开发环境)
将本地的frontend和backend目录直接挂载到容器的工作目录,而不是./data下的目录:
修改docker-compose.yml的volumes部分:
services: backend: # ...其他配置 volumes: - ./backend:/backend_app frontend: # ...其他配置 volumes: - ./frontend:/frontend_app
这样本地修改代码后,容器内的代码会实时更新,同时确保容器能找到所需文件。
内容的提问来源于stack exchange,提问作者fullstacknoob

