我在 Node.js 中编写了一个小脚本,该脚本调用 Python 文件并拦截 Python 文件的输出。我首先使用 docker build -t backend_airbnb 构建 Dockerfile。然后使用 docker compose up -d 运行 docker compose。之后我检查容器是否正在运行,但它直接关闭,没有错误消息。它只显示backend_airbnb 已退出,代码为 0
。
如何构建一个多阶段 Dockerfile,首先安装 python 要求,然后安装 Node(反之亦然)并运行 npm start
?这样我就可以在 POST 请求进入时执行我的 Python 文件。
文件夹结构
|-- app.js
|-- requriments.txt
|-- test.js
|-- routes
|-- |-- model.py
|-- |-- post_price.js
Dockerfile
FROM python:3.6.8
#RUN mkdir -p /usr/src/app
COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
FROM node:14
WORKDIR /opt/app
COPY package*.json ./
RUN npm install
ENV NODE_ENV=container
COPY . .
EXPOSE 4001
CMD npm start
docker-compose.yml
version: '3.8'
services:
backend:
container_name: backend_airbnb
image: backend_airbnb
expose:
- "4001"
ports:
- "4001:4001"
networks:
- backendProxyNetwork
networks:
backendProxyNetwork:
external: true
编辑 没用,还是同样的问题 新的 Dockerfile ( Multiple FROMs - what it means )
FROM python:3.6.8 AS build
#RUN mkdir -p /usr/src/app
COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
FROM node:14
WORKDIR /opt/app
COPY --from=build package*.json ./
RUN npm install
ENV NODE_ENV=container
COPY . .
EXPOSE 4001
CMD npm start
最佳答案
您定义的图像存在一些错误:
第一。您正在尝试从 node
镜像使用 Python,但该镜像没有安装 python
,因此这不起作用。
第二。即使您在多阶段构建的第一阶段安装了 Python 依赖项,如果您不将这些依赖项传递到下一阶段,就好像您没有执行任何操作。
实现您想要的东西的方法很少,但我会告诉您我会做什么。
首先,您需要同意要在项目中使用哪个 Python 版本,假设您要使用 Python 3.10。
然后,您需要在该构建容器中创建一个 venv
,因为这是您随后将传递给运行时容器的内容:
FROM python:3.10 as build
WORKDIR /opt/app
RUN python -m venv /opt/app/venv
ENV PATH="/opt/app/venv/bin:$PATH"
COPY requirements.txt .
RUN pip install -r requirements.txt
现在,您将在 venv
上安装所有依赖项,因此您可以将它们携带到运行时容器(您需要在其中安装与构建镜像中使用的相同的 Python 版本) .
FROM node:14
RUN apt update \
&& apt install software-properties-common \
&& add-apt-repository ppa:deadsnakes/ppa \
&& apt update \
&& apt install python3.10
WORKDIR /opt/app
COPY --from=build /opt/app/venv /venv
ENV PATH="/opt/app/venv/bin:$PATH"
ENV NODE_ENV=container
COPY package-*.json .
RUN npm install
COPY . .
EXPOSE 4001
CMD npm start
这样,您将在运行时 Node 镜像上安装 Python 3.10,并在 Python 3.10 构建镜像上安装您已经下载/编译的依赖项。
关于python - 在同一个 Dockerfile 中使用 Python 和 Node.js 并创建一个我在云中同时使用的镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71197350/