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
相关产品推荐
相关产品推荐

