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

标签 python node.js docker docker-compose dockerfile

我在 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/

相关文章:

python - 统一打印某个数的倍数

node.js - 使用 json 数组在 Postgresql 中进行参数化查询

wordpress - 卷安装的 docker-compose/wordpress 权限错误

string - Docker 镜像的性能差异

python - 具有共享队列和结束条件的多处理

python - 使用 Sqlalchemy 时 Session_scope 引发属性错误

python - 子弹看起来不像是从枪嘴里出来的 Pygame

javascript - ESLint - 'process' 未定义

node.js - Node.js 中的 Memcache 返回大小不同的对象

vagrant - 用于开发的 Docker - 监视/自动构建?