我们正在GAE上设置一个节点应用程序,我们使用的一个库不能很好地与Unix套接字配合使用。
GAE 中的云代理设置使用 unix 套接字,我已经用谷歌搜索并搜索了谷歌文档,但找不到有关配置在 GAE 中创建的云代理(即在生产中(以使用 TCP 套接字的信息。
(我在测试时已经在本地完成了它,但无法弄清楚我需要在我的 app.yaml 中设置什么才能在生产中实现它(
若要能够在应用中使用 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/bashn./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 中指出的那样。
不要忘记启用云 SQL API 来运行它。
我在这里使用了这个例子,你可以看到server.js
中的函数connect
有一个这样的 if 条件:
if (process.env.INSTANCE_CONNECTION_NAME && process.env.NODE_ENV === 'production') {
config.socketPath =/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}
}
如果您有类似的东西,请删除它,因为您现在没有在环境变量中提供INSTANCE_CONNECTION_NAME。
这是这种情况的解决方法,但如果不是这样,我认为这是不可能的。