【问题标题】:Sharing code between flexible environment modules in a GAE project在 GAE 项目中的柔性环境模块之间共享代码
【发布时间】:2017-07-16 19:04:03
【问题描述】:

我正在将我的 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 进行部署,而lib/ 不是不在那里)。

那么,有什么方法可以共享lib/ 代码(除了将其拉入它自己的库并使用pip 安装)?

【问题讨论】:

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


    【解决方案1】:

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

    问题

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

    解决方案

    • 当您的源代码树或您的打包系统添加到基础镜像时,Docker 不遵循符号链接,因此外部的任何源文件 您的应用程序目录中的符号链接引用的 源代码树不会被复制到您的应用程序中。

    另外 - dependencies in the flex environment 应该基于用于在部署时构建 dockerfile 的 requirements.txt 文件,而不是通过 pip 将库安装到 lib 目录(即 the standard environment way .

    【讨论】:

    • 所以即使我将要共享的代码打包成一个包,如果不将其发布到 PyPi,我也无法让它在 GAE 上运行?
    • 尝试复制(也许复制到服务的目录,而不是它的lib 子目录?)而不是符号链接,就好像它会成为您的应用程序代码的一部分而不是外部依赖项一样。如果可行,那么您可以研究如何方便但可靠地跨服务复制它(也许使用 git 子模块之类的东西?)
    【解决方案2】:

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

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

    我的解决方案是创建这个两行 bash 脚本:

    rm -rf deploy_dir
    cp -RLp code_dir deploy_dir
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      以下示例在共享相同代码的 2 个服务中完成不同的入口点: ...这是假设正在使用“弹性”而不是“标准”应用引擎产品。

      假设您有一个名为 my-proj 的项目 使用不重要的默认服务 还有一个名为 queue-processor 的服务,它使用同一目录中的大部分相同代码。 为其创建一个单独的 dockerfile,名为 QueueProcessorDockerfile 和一个名为 queue-processor-app.yaml 的单独 app.yaml 告诉谷歌应用引擎我想要发生什么。

      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 中有一个“进程队列”脚本 queue-processor-app.yaml

      runtime: custom
      env: flex
      ... other stuff...
      ...
      
      1. 构建并标记 docker 镜像 在这里查看谷歌指南 -> 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配置文件,以及你推送的图片url gcloud app deploy queue-processor-app.yaml --image-url eu.gcr.io/my-proj/queue-processor

      【讨论】:

        猜你喜欢
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多