在GAE项目中的灵活环境模块之间共享代码

时间:2017-02-26 02:52:13

标签: python google-app-engine app-engine-flexible

我正在构建我的GAE(flex)项目作为许多服务:

- my-project/
  - services/
    - service_1/
      - service_1.yaml
    - service_2/
      - service_2.yaml

我现在想在服务之间分享一些代码。理想情况下,我希望对服务有一个my-project/lib/和符号链接:

  • my-project/services/service_1/lib -> ../../lib
  • my-project/services/service_2/lib -> ../../lib

但是gcloud app deploy(我从yaml文件所在的服务目录运行)忽略了符号链接(我在上传之前检查了tgz文件得到了GAE for部署并且lib/不存在。)

那么,有没有办法分享lib/代码(除了将其拉入自己的库并使用pip安装)?

3 个答案:

答案 0 :(得分:1)

复制我的类似问题的答案。 Multiple services with different dockerfiles on GAE Flexible

tl; dr:构建一个单独的docker映像,将其推送到GCR,然后使用该映像进行部署。

指定自定义运行时。 在本地构建图像,对其进行标记,然后将其推送到Google Container Registry(GCR) 然后,部署服务,指定自定义服务文件,并使用--image-url选项在GCR上指定远程映像。

下面是一个示例,该示例在共享相同代码的2个服务中完成不同的入口点: ...这是假设正在使用“ flex”而非“标准”的应用程序引擎产品。

让我们说您有一个名为 my-proj 的项目 使用不重要的默认服务 第二个服务叫做 queue-processor ,该服务正在使用同一目录中的许多相同代码。 为它创建一个单独的dockerfile,名为 QueueProcessorDockerfile 以及名为 queue-processor-app.yaml 的单独app.yaml来告诉Google App Engine我想要发生什么。

QueueProcessorDockerfile

FROM node:10
# Create app directory
WORKDIR /usr/src/app
COPY package.json ./
COPY yarn.lock ./
RUN npm install -g yarn
RUN yarn
# Bundle app source
COPY . .
CMD [ "yarn", "process-queue" ]

*当然,我的package.json中有一个“ process-queue”脚本 queue-processor-app.yaml

runtime: custom
env: flex
... other stuff...
...
  1. 构建并标记docker映像 在此处查看Google指南-> https://cloud.google.com/container-registry/docs/pushing-and-pulling docker build -t eu.gcr.io/my-proj/queue-processor -f QueueProcessorDockerfile。
  2. 将其推送到GCR docker push eu.gcr.io/my-proj/queue-processor
  3. 部署服务,指定Google应该使用哪个yaml配置文件,以及您推送的图片网址 gcloud应用程序部署queue-processor-app.yaml --image-url eu.gcr.io/my-proj/queue-processor

答案 1 :(得分:0)

使用符号链接跨服务共享代码的方法可能不适用于基于docker的flex环境。这种怀疑是基于Troubleshooting Custom Runtimes的最后一行表格

  

问题

     
      
  • 我的应用程序中未包含某些文件。
  •   
     

解决方案

     
      
  • 当源树或包装系统添加到基本映像时,Docker不遵循符号链接,因此外部的所有源文件   您的应用程序目录中的符号链接引用的目录   源树不会被复制到您的应用程序中。
  •   

此外 - dependencies in the flex environment应该基于用于在部署时构建dockerfile的requirements.txt文件,而不是基于pip将它们安装到{{1 dir是the standard environment way

答案 2 :(得分:0)

我想出了另一种解决方案,似乎是一堆糟糕的替代方案中最好的一种……这是我所排除的:

  • 硬链接-GIT不支持
  • git子模块或子树-太复杂了
  • 将共享代码拆分到另一个项目并添加到requirements.txt中-也太复杂了

我的解决方案是创建以下两行bash脚本:

rm -rf deploy_dir
cp -RLp code_dir deploy_dir

它将所有我的代码复制到一个新目录,并且在复制过程中,所有符号链接都被替换为它们链接到的文件。然后,我从deploy_dir

进行部署