Этапы Dockerfile для Django/react не работают вместе
У меня есть многоступенчатый Dockerfile для приложения Django/React, который создает следующую ошибку при запуске docker-compose up --build
:
backend_1 | File "/code/myapp/manage.py", line 17
backend_1 | ) from exc
backend_1 | ^
backend_1 | SyntaxError: invalid syntax
backend_1 exited with code 1
В настоящее время только контейнер frontend может работать с двумя нижеприведенными файлами:
Dockerfile:
FROM python:3.7-alpine3.12
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY . /code
RUN pip install -r ./myapp/requirements.txt
FROM node:10
RUN mkdir /app
WORKDIR /app
# Copy the package.json file into our app directory
# COPY /myapp/frontend/package.json /app
COPY /myapp/frontend /app
# Install any needed packages specified in package.json
RUN npm install
EXPOSE 3000
# COPY /myapp/frontend /app
# COPY /myapp/frontend/src /app
CMD npm start
docker-compose-yml:
version: "2.0"
services:
backend:
build: .
command: python /code/myapp/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
networks:
- reactdrf
web:
build: .
depends_on:
- backend
restart: always
ports:
- "3000:3000"
stdin_open: true
networks:
- reactdrf
networks:
reactdrf:
Структура проекта (соответствующие части):
project (каталог верхнего уровня)
- api (бэкенд django)
- фронтенд
- public
- src
- package.json
- myapp
- manage.py
- requirements.txt
docker-compose.yml
Dockerfile
Интересно то, что если закомментировать один сервис из Dockerfile или docker-compose.yml или другой, то оставшаяся часть работает нормально, т.е. каждый сервис может прекрасно работать сам по себе с заданными синтаксисами. Только при объединении я получаю вышеуказанную ошибку.
Я думал, что это может быть проблемой сети docker (контейнеры не видят друг друга), но ошибка больше похожа на проблему местоположения, хотя каждый сервис может нормально работать сам по себе?
Не уверен, в каком направлении двигаться дальше, любое понимание приветствуется.
Обновление:
Неправильно сконфигурировал свой проект, вот что я сделал, чтобы решить эту проблему: Разделил frontend и backend на их собственные Dockerfiles так, что 1-я часть моего Dockerfile выше (backend) является единственной частью Dockerfile, остающейся в корневом каталоге, а остальная часть находится в собственном Dockerfile в /frontend.
Обновлен путь сборки веб-сервиса docker-compose.yml, чтобы указать на это новое местоположение,
...
web:
build: ./myapp/frontend
...
кажется, что сборка теперь отправляет данные из бэкенда во фронтенд.
Что я узнал - несколько Dockerфайлов для нескольких сервисов. Склеивается вместе в docker-compose.yml вместо того, чтобы объединить их в один Dockerfile.