2

我们正在 GAE 上设置一个节点应用程序,而我们使用的其中一个库不能很好地与 unix 套接字配合使用。

GAE 中的云代理设置使用 unix 套接字,我用谷歌搜索并搜索了谷歌文档,但找不到有关配置在 GAE(即生产中)中创建的云代理以使用 TCP 套接字的信息。

(我在测试时已在本地完成,但无法弄清楚我需要在 app.yaml 中设置什么才能使其在生产中发生)

4

1 回答 1

0

为了能够在您的应用程序中使用 TCP 套接字,您必须迁移到自定义运行时

您可以使用以下命令生成 Dockerfile

$ gcloud beta app gen-config --custom

在为此运行时生成 Dockerfile 后,将其修改如下:

FROM gcr.io/google_appengine/nodejs
RUN /usr/local/bin/install_node '>=4.3.2'
RUN apt-get update
RUN apt-get install mysql-client -yy
RUN apt-get install wget -yy
COPY . /app/
RUN npm install --unsafe-perm || \
  ((if [ -f npm-debug.log ]; then \
      cat npm-debug.log; \
    fi) && false)
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
RUN chmod +x cloud_sql_proxy
RUN echo -e “#!/bin/bash\n./cloud_sql_proxy -instances=YOUR-INSTANCE-DB=tcp:3306 &\nnode server.js” > script.sh
RUN chmod +x script.sh
CMD bash script.sh

这在部署时将生成容器,并且该容器将使代理通过 TCP 进行通信。

在部署之前,app.yaml您必须在文件中从 中删除env_variables INSTANCE_CONNECTION_NAME,因为您已经在 Dockerfile 中指出了这一点。

不要忘记启用 Cloud SQL API来运行它。

在这里使用了示例,您可以看到其中的函数connect具有server.js这样的 if 条件:

if (process.env.INSTANCE_CONNECTION_NAME && process.env.NODE_ENV === 'production') {
    config.socketPath =/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}
}

如果您有类似的内容,请在环境变量 INSTANCE_CONNECTION_NAME 中删除它,因为您现在没有提供。

这是解决这种情况的一种方法,但如果不是这样,我认为不可能。

于 2018-04-12T08:31:19.347 回答