Docker Compose启动找不到manage.py及VPS部署端口配置问题
问题解答
1. 为何会出现找不到manage.py的错误?
这个错误是由Dockerfile文件复制路径错误和docker-compose挂载/命令配置冲突共同导致的:
(1)Dockerfile的COPY命令逻辑错误
你的后端Dockerfile中执行了COPY . back,这条命令会把宿主机back目录下的所有文件复制到容器的/app/back目录中。也就是说,manage.py实际在容器内的路径是/app/back/manage.py,但你在CMD里写的是python manage.py runserver,Docker会在当前工作目录/app下查找文件,自然找不到。
正确写法应该是把back目录的内容直接复制到容器的/app目录:
# 替换原来的COPY . back COPY . .
(2)docker-compose的配置冲突
你的docker-compose.yml中给后端服务配置了:
volumes: - ./:/back command: python3 manage.py runserver 0.0.0.0:8000
- 挂载的
./:/back是把宿主机包含back、front的根目录挂载到容器的/back目录,和容器的工作目录/app完全无关,不仅帮不上忙,还可能造成路径混淆。 command里依然是在/app目录下找manage.py,路径完全不对。
如果需要本地开发时挂载代码实现热更新,应该把宿主机的back目录挂载到容器的/app:
volumes: - ./back:/app
2. 部署到VPS后如何配置80端口访问并绑定域名?
生产环境不能用开发服务器(Django的runserver、Vue的dev命令),需要用静态文件托管+反向代理的方式,把80端口的请求转发到前端和后端,步骤如下:
(1)调整前端Dockerfile(构建生产静态文件)
Vue项目需要先构建成静态文件,用Nginx托管:
# 构建阶段 FROM node:20-alpine3.17 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . # 执行生产构建,生成dist目录 RUN npm run build # 托管阶段 FROM nginx:alpine # 把构建好的静态文件复制到Nginx默认目录 COPY --from=builder /app/dist /usr/share/nginx/html # 自定义Nginx配置(处理路由转发和API代理) COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
(2)调整后端Dockerfile(用生产服务器)
替换Django的runserver为Gunicorn(生产级WSGI服务器):
FROM python:3.10 WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 安装Gunicorn(也可以直接加到requirements.txt里) RUN pip install gunicorn COPY . . EXPOSE 8000 # 替换为Gunicorn启动命令,注意把your_project_name改成你的Django项目名 CMD ["gunicorn", "--bind", "0.0.0.0:8000", "your_project_name.wsgi:application"]
(3)编写Nginx配置文件(nginx.conf)
在前端目录下创建nginx.conf,配置反向代理,把前端路由和后端API请求分开处理:
server { listen 80; # 替换成你的域名 server_name your-domain.com; # 处理前端静态文件和SPA路由 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } # 转发后端API请求(假设后端接口前缀是/api) location /api/ { proxy_pass http://back:8000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
(4)调整docker-compose.yml
移除开发相关的挂载和命令,让前端容器直接监听80端口:
version: "3.8" services: db: image: postgres:15-alpine volumes: - ./db:/var/lib/postgresql/data environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=postgres restart: always back: build: ./back env_file: ./back/.env depends_on: - db restart: always # 不需要暴露端口给外部,容器内部可直接访问 front: build: ./front ports: - "80:80" depends_on: - back restart: always
(5)VPS部署步骤
- 把代码上传到VPS(用
git clone或者scp); - 确保VPS安装了Docker和Docker Compose;
- 在域名服务商处把域名解析到VPS的公网IP;
- 进入项目根目录,执行
docker-compose up -d启动所有服务; - (可选)用Certbot申请免费SSL证书,配置Nginx监听443端口,实现HTTPS访问。
内容的提问来源于stack exchange,提问作者crawlingdev
相关产品推荐
相关产品推荐

