在同一个 Dockerfile 中使用 Python 和 Node.js 并创建一个我在云中同时使用的映像

Tes*_*est 2 python node.js docker dockerfile docker-compose

我在 Node.js 中编写了一个小脚本,该脚本调用 Python 文件并拦截 Python 文件的输出。我首先使用 构建 Dockerfile,docker build -t backend_airbnb .然后使用 运行 docker compose docker compose up -d。之后我检查容器是否正在运行,但它直接关闭,没有错误消息。它只是说backend_airbnb exited with code 0

如何构建一个多阶段 Dockerfile,首先安装 python 要求,然后安装 Node(反之亦然)并运行npm start?这样我就可以在 POST 请求进入时执行我的 Python 文件。

文件夹结构

|-- app.js
|-- requriments.txt
|-- test.js
|-- routes
|-- |-- model.py
|-- |-- post_price.js
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

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
Run Code Online (Sandbox Code Playgroud)

编辑 不起作用,仍然是同样的问题新的 Dockerfile(多个 FROM - 这意味着什么

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
Run Code Online (Sandbox Code Playgroud)

Dan*_*res 5

您定义的图像存在一些错误:

第一。您正在尝试从映像使用 Python node,但该映像尚未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
Run Code Online (Sandbox Code Playgroud)

现在,您将在您的 上安装所有依赖项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
Run Code Online (Sandbox Code Playgroud)

这样,您将在运行时 Node 映像上安装 Python 3.10,并在 Python 3.10 构建映像上安装您已经下载/编译的依赖项。