FastAPI应用Docker化构建时app文件夹重复复制问题求助
FastAPI Docker化:app文件夹重复问题排查与解决
问题现象
容器内目录出现嵌套的app/app结构,与预期的单层app目录不符。
现有Dockerfile内容
FROM ubuntu:22.04 WORKDIR /usr/ ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 COPY . /usr/src/ ARG DEBIAN_FRONTEND=noninteractive RUN apt update \ && apt-get -y install postgresql postgresql-contrib python3 python3-pip libsm6 libxext6 libxrender-dev mlocate \ && updatedb \ && pip install --upgrade pip setuptools wheel \ && pip install fastapi uvicorn facebook-scraper pytest requests asyncpg databases psycopg2-binary SQLAlchemy
现有docker-compose.yml内容
version: '3.8' services: web: build: ./src command: | bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000' volumes: - ./src/:/usr/src/app/ ports: - 8002:8000 environment: - DATABASE_URL=postgresql://hello_fastapi:hello_fastapi@db/facebook_posts db: image: postgres:13-alpine volumes: - postgres_data:/var/lib/postgresql/data/ expose: - 5432 environment: - POSTGRES_USER=hello_fastapi - POSTGRES_PASSWORD=hello_fastapi - POSTGRES_DB=facebook_posts volumes: postgres_data:
容器内实际目录结构
. |-- Dockerfile |-- app | |-- Dockerfile | |-- app | | |-- __init__.py | | |-- api | | | |-- __init__.py | | | |-- crud.py | | | |-- models.py | | | `-- posts.py | | |-- db.py | | `-- main.py | `-- requirements.txt `-- requirements.txt
预期目录结构
. ├── docker-compose.yml └── src ├── app │ ├── api │ │ ├── crud.py │ │ ├── __init__.py │ │ ├── models.py │ │ └── posts.py │ ├── db.py │ ├── __init__.py │ └── main.py ├── Dockerfile └── requirements.txt
问题根源
- Dockerfile路径配置错误:
WORKDIR /usr/设置了不合理的基准目录,COPY . /usr/src/将本地src目录下的所有内容复制到容器/usr/src/,导致基础镜像内已有一层app文件夹。 - 卷挂载路径冲突:docker-compose中
- ./src/:/usr/src/app/将本地src目录挂载到容器/usr/src/app/,使得容器内/usr/src/app/下又叠加了一层本地的app文件夹,最终形成嵌套结构。
修复步骤
1. 调整Dockerfile路径配置
FROM ubuntu:22.04 # 设置容器内工作目录为最终运行目录 WORKDIR /usr/src/app ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # 复制本地src目录下的内容到容器工作目录 COPY . . ARG DEBIAN_FRONTEND=noninteractive RUN apt update \ && apt-get -y install postgresql postgresql-contrib python3 python3-pip libsm6 libxext6 libxrender-dev mlocate \ && updatedb \ && pip install --upgrade pip setuptools wheel \ && pip install fastapi uvicorn facebook-scraper pytest requests asyncpg databases psycopg2-binary SQLAlchemy
2. 保持卷挂载路径一致性
docker-compose的卷挂载无需修改,因为调整后的Dockerfile工作目录已与挂载路径匹配,避免了嵌套:
version: '3.8' services: web: build: ./src command: | bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000' volumes: - ./src/:/usr/src/app/ ports: - 8002:8000 environment: - DATABASE_URL=postgresql://hello_fastapi:hello_fastapi@db/facebook_posts db: image: postgres:13-alpine volumes: - postgres_data:/var/lib/postgresql/data/ expose: - 5432 environment: - POSTGRES_USER=hello_fastapi - POSTGRES_PASSWORD=hello_fastapi - POSTGRES_DB=facebook_posts volumes: postgres_data:
3. 验证修复效果
执行以下命令重新构建并启动容器:
docker-compose down docker-compose build --no-cache docker-compose up -d
进入容器查看目录结构:
docker-compose exec web bash tree /usr/src/app
此时容器内的目录结构应与本地src目录一致,不再出现嵌套的app文件夹。
内容的提问来源于stack exchange,提问作者i'mgnome
相关产品推荐
相关产品推荐

