单个 Docker 容器中的 Flask 和 React 应用程序

Ben*_*Tan 0 docker dockerfile

美好的一天,

我知道这是不好的做法,我应该每个容器有一个应用程序,但是有没有办法让我在同一个容器中同时运行两个服务,我将如何为它编写 Dockerfile?

我当前用于 Flask(后端)应用程序的 Dockerfile:

FROM python:3.6.9-slim-buster

WORKDIR /app/flask_backend

ENV PYTHONPATH "${PYTHONPATH}:/app"

COPY ./flask_backend ./

COPY requirements.txt .
RUN pip install -r requirements.txt

CMD python3 app/webapp/app.py
Run Code Online (Sandbox Code Playgroud)

我的 React(前端)Dockerfile:

FROM node:12.18.0-alpine as build

WORKDIR /app/react_frontend

ENV PATH /app/node_modules/.bin:$PATH
ENV NODE_OPTIONS="--max-old-space-size=8192"

COPY ./react_frontend/package.json ./
COPY ./react_frontend/package-lock.json ./

RUN npm ci
RUN npm install react-scripts@3.4.1 -g
RUN npm install serve -g

COPY ./react_frontend ./

CMD ["serve", "-s", "build", "-l", "3000"]
Run Code Online (Sandbox Code Playgroud)

我尝试在同一个 Docker 容器中启动两个应用程序是为了合并两个 Dockerfile,但生成的容器没有来自第一个 Dockerfile 的数据,我不确定如何继续。

我合并的 Dockerfile:

FROM python:3.6.9-slim-buster

WORKDIR /app/flask_backend

ENV PYTHONPATH "${PYTHONPATH}:/app"

COPY ./flask_backend ./

COPY requirements.txt .
RUN pip install -r requirements.txt

CMD python3 app/webapp/app.py

FROM node:12.18.0-alpine as build

WORKDIR /app/react_frontend

ENV PATH /app/node_modules/.bin:$PATH
ENV NODE_OPTIONS="--max-old-space-size=8192"

COPY ./react_frontend/package.json ./
COPY ./react_frontend/package-lock.json ./

RUN npm ci
RUN npm install react-scripts@3.4.1 -g
RUN npm install serve -g

COPY ./react_frontend ./

CMD ["serve", "-s", "build", "-l", "3000"]
Run Code Online (Sandbox Code Playgroud)

我是Docker的初学者,因此我预见到使用这种方法会出现几个问题,例如两个应用程序之间的通信(Backend使用端口5000)。任何指导将不胜感激!

Dav*_*aze 8

一个作出反应的应用程序通常不会有一个服务器本身(的发展,仅泊坞窗设置除外)。相反,您可以运行 Webpack 之类的工具将其编译为静态文件,然后您可以将其提供给浏览器,然后浏览器运行它们。

在您的主机系统上,您会运行类似

yarn build
Run Code Online (Sandbox Code Playgroud)

产生一个dist目录;然后将其复制到 Flask静态目录中

如果您完全提前执行此操作,那么您可以在 Python 虚拟环境中运行您的应用程序,这将更容易开发和测试设置,并且您显示的 Dockerfile 不会更改。

如果您想完全在 Docker 中构建它(例如,为了利用更 Docker 原生的自动构建系统),多阶段构建在这里非常匹配。您可以使用第一阶段来构建前端应用程序,然后COPY在第二阶段将其构建到最终应用程序中。这看起来大致如下:

yarn build
Run Code Online (Sandbox Code Playgroud)

这种方法与使用绑定挂载覆盖 Docker 镜像内容的设置不兼容。非 Docker 主机 Node 和 Python 设置将是一个更容易的开发环境,并且对于这种特定设置,不太可能与 Docker 设置有很大不同。