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

Django/React多阶段Dockerfile配合docker-compose运行报错问题求助

问题根因

你当前的问题核心出在多阶段Dockerfile的构建逻辑和compose服务配置的不匹配:

  • Docker多阶段构建的最终生成镜像默认只保留最后一个阶段的内容,你当前的Dockerfile最后一个阶段是node:10镜像,所以无论你给backend还是web服务用这个Dockerfile构建,最终得到的镜像运行环境都是Node环境,没有Python运行时。
  • node:10镜像内置的python版本为2.7,而Django的manage.py中使用的raise X from exc是Python3专属语法,用Python2运行就会抛出你遇到的SyntaxError。
  • 单独注释一个服务能正常运行的原因也很明确:注释Node阶段后最终镜像为Python环境,backend服务正常;注释Python阶段后最终镜像为Node环境,web服务正常。

解决方案

拆分前后端的Dockerfile,不要共用同一个多阶段构建文件,两个独立服务需要独立的构建配置:

步骤1:拆分Dockerfile

在项目根目录新建两个独立的Dockerfile:

Dockerfile.backend(后端构建配置)

FROM python:3.7-alpine3.12
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY . /code
RUN pip install -r ./myapp/requirements.txt

Dockerfile.frontend(前端构建配置)

FROM node:10
RUN mkdir /app
WORKDIR /app
COPY /myapp/frontend /app
RUN npm install
EXPOSE 3000
CMD npm start

步骤2:修改docker-compose.yml配置

分别给两个服务指定对应的构建文件:

version: "2.0"
   
services:
  backend:
    build:
      context: .
      dockerfile: Dockerfile.backend
    command: python /code/myapp/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    networks:
      - reactdrf
  web:
    build:
      context: .
      dockerfile: Dockerfile.frontend
    depends_on:
      - backend
    restart: always
    ports:
      - "3000:3000"
    stdin_open: true
    networks:
      - reactdrf

networks:
  reactdrf:

步骤3:重新构建启动

执行docker-compose up --build即可正常启动两个服务。

内容的提问来源于stack exchange,提问作者jocham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 03:57:02