0

我正在将我的 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)?

4

3 回答 3

1

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

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

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

rm -rf deploy_dir
cp -RLp code_dir deploy_dir

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

于 2019-06-05T14:45:01.203 回答
1

从类似的问题中复制我的答案。 GAE Flexible 上具有不同 dockerfile 的多个服务

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

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

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

假设您有一个名为my-proj的项目,该项目 有一个不重要的默认服务和一个名为queue-processor的第二个服务,它使用同一目录中的大部分相同代码。为它创建一个名为QueueProcessorDockerfile的单独 dockerfile 和一个名为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 映像在此处查看 googles 指南 -> https://cloud.google.com/container-registry/docs/pushing-and-pulling docker build -t eu.gcr.io/my-proj/queue-处理器 -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
于 2019-09-26T15:19:51.380 回答
-1

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

问题

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

解决方案

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

此外 - flex 环境中的依赖项应该基于requirements.txt用于在部署时构建 dockerfile 的文件,而不是通过pip将它们安装到标准环境方式lib的dir中的库中的 vendoring 。

于 2017-02-26T05:33:59.413 回答