You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题根源

  1. Dockerfile路径配置错误:WORKDIR /usr/设置了不合理的基准目录,COPY . /usr/src/将本地src目录下的所有内容复制到容器/usr/src/,导致基础镜像内已有一层app文件夹。
  2. 卷挂载路径冲突: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:48:21