Docker-Compose启动Python后端时找不到main.py文件的问题
解决Docker Compose启动Python后端找不到main.py的问题
问题现象
Docker容器构建成功,但执行docker-compose up时Python后端容器提示找不到main.py文件,服务启动失败:
python-backend | python3: can't open file './main.py': [Errno 2] No such file or directory python-backend exited with code 2
目录结构
|-app | |-facadeadd | | |-bd | | | |-Dockerfile | | |... |-Dockerfile |-main.py |-docker-compose.yml |-requirements.txt
相关配置文件
后端Dockerfile
FROM python:3.8 RUN apt-get update -y; apt-get upgrade -y RUN yes | apt install build-essential portaudio19-dev RUN python -m pip install --upgrade pip WORKDIR /usr/src/app COPY requirements.txt ./dependecies/ COPY . /usr/src/app/ RUN pip install --upgrade pip RUN pip install torch RUN pip install -r requirements.txt
数据库Dockerfile
FROM mysql:latest COPY ./Titulos.xlsx ./bd/
docker-compose.yml
version: '3.8' services: python_app: build: ./ container_name: python-backend volumes: - ./app:/usr/src/app command: sh -c "sleep 10s ; python3 ./main.py" depends_on: - mysql_db mysql_db: build: ./facadeadd/bd/ container_name: mysql-bd restart: always volumes: - ./bd/:/var/lib/mysql-bd/ environment: MYSQL_DATABASE: 'bd' MYSQL_ROOT_PASSWORD: 'password' ports: - '3300:3300'
错误原因分析
核心问题出在Python服务的volume挂载配置:volumes: - ./app:/usr/src/app 将主机的app目录挂载到容器的/usr/src/app目录,完全覆盖了容器构建时复制的所有文件(包括根目录的main.py)。而主机的app目录中并不存在main.py,导致容器启动时找不到该文件。
此外,数据库服务也存在两处配置问题:
- MySQL默认端口为3306,当前ports映射
3300:3300无法正常访问数据库 - MySQL默认数据存储目录为
/var/lib/mysql,当前volume挂载路径错误
解决方案
1. 修复Python服务的挂载问题
根据需求选择以下两种方案之一:
方案A:开发环境(需要挂载本地代码实时更新)
修改docker-compose.yml中python_app的volumes配置,将主机根目录挂载到容器工作目录:
python_app: # ...其他配置不变 volumes: - ./:/usr/src/app # 替换原有的./app:/usr/src/app
方案B:生产环境(不需要挂载本地文件)
直接删除python_app下的volumes配置,容器将使用构建时复制的文件:
python_app: build: ./ container_name: python-backend # 删掉volumes这一行 command: sh -c "sleep 10s ; python3 main.py" # 可以去掉./,因为WORKDIR已经是/usr/src/app depends_on: - mysql_db
2. 修复数据库服务的配置问题
修改docker-compose.yml中mysql_db的配置:
mysql_db: build: ./facadeadd/bd/ container_name: mysql-bd restart: always volumes: - ./bd/:/var/lib/mysql # 修正数据目录路径 environment: MYSQL_DATABASE: 'bd' MYSQL_ROOT_PASSWORD: 'password' ports: - '3300:3306' # 修正端口映射
3. 重新启动服务
执行以下命令重新构建并启动服务:
docker-compose down docker-compose up --build
内容的提问来源于stack exchange,提问作者matheus hopper
相关产品推荐
相关产品推荐

