首页 > 解决方案 > 如何构建 docker 以从 Google App Engine 中的 Node.js child_process 运行 Python3?

问题描述

我正在使用 flex 环境在自定义运行时部署 node.js Web 应用程序。我在 Node.js 中调用 child_process 来打开 python3:

const spawn = require("child_process").spawn;
pythonProcess = spawn('python3');

它在本地运行良好,但是当部署到 GAE 时,它给了我一个错误,如下所示:

Error: spawn python3 ENOENT
   at Process.ChildProcess._handle.onexit (child_process.js:240)
   at onErrorNT (internal/child_process.js:415)
   at process._tickCallback (next_tick.js:63)

但是,当我运行 python2 时,它工作正常。

在做了一些研究和挖掘之后,我在stackoverflow上遇到了这个问题

如何在 Google Cloud Platform 中为 Node 应用程序安装 Python3

似乎我必须从 docker 文件构建自定义运行时以允许多个运行时(类似的东西)。

我用 docker 文件尝试了无数的东西,例如:

# Trying to install python3
FROM ubuntu as stage0
WORKDIR /python/
RUN apt-get update || : && apt-get install --yes python3;
RUN apt-get install python3-pip -y

# My main node.js docker stuff 
FROM gcr.io/google_appengine/nodejs
COPY . /app/
... etc

# From google app engine python runtime docker repo
FROM gcr.io/google-appengine/python
RUN virtualenv /env
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
ADD . /app

# My main node.js docker stuff 
FROM gcr.io/google_appengine/nodejs
COPY . /app/
... etc

它都没有奏效。

这样做的正确方法是什么,我该怎么做?

谢谢你。

标签: pythonnode.jsdockergoogle-app-engineruntime

解决方案


Google 的镜像是基于 ubuntu 但只有 python 2 和 2.7。这个答案展示了如何使用 python3.6,但我们将通过 software-properties-common 安装 3.5。把东西放在一起,你会得到:

FROM launcher.gcr.io/google/nodejs
# same as
# FROM gcr.io/google-appengine/nodejs


RUN apt-get update && apt-get install software-properties-common -y
# RUN unlink /usr/bin/python
# RUN ln -sv /usr/bin/python3.5 /usr/bin/python
# RUN python -V
RUN python3 -V

# Copy application code.
COPY . /app/

# Install dependencies.
RUN npm --unsafe-perm install

如果你只是python3要从你的 spawn 调用,你不需要取消我包含的链接(注释行),这样你就可以调用 python。


推荐阅读