如何在不将包发布到 npm 注册表的情况下将依赖于 yarn 工作区的应用程序部署到 Google App Engine?

How can I deploy to Google App Engine an app that depends on a yarn workspaces without publishing the packages to a npm registry?

我目前正在将我们的 monorepo 迁移到 yarn 工作区。它包含多个包和服务。服务依赖于各自 package.json 中的包。我想将我的服务部署到 Google App Engine,而不必将包发布到私有 npm 注册表。

我设法通过使用自定义 运行time 并将 app.yamlDockerfile 移动到 monorepo 的根目录来部署单个服务,以便访问构建上下文中的包和服务。问题是我有多个服务,我不能将所有 dockerfile 都放在 monorepo 的根目录下,因为它们必须被命名为 Dockerfile 并且我无法更改构建上下文。

我看到 2 个天真的解决方案:

首先是在部署之前将相应服务的 app.yamlDockerfile 移动到 monorepo 的根目录。但这看起来很脏,会使 CI 代码非常复杂。

第二种方法是在 monorepo 的根目录下有一个 Dockerfileservice1.yamlservice2.yaml 等,并将变量传递给 Dockerfile。问题是我在 App Engine 文档中看不到任何将变量传递给自定义 运行time.

Dockerfile 的方法

我梦想的解决方案是能够将每个 Dockerfileapp.yaml 保存在各自服务的目录中,并能够通过 gcloud 设置构建上下文CLI(就像我们在 docker-compose 中所做的那样)。 示例:

project
├── package.json
├── packages
│   ├── package1
│   │   ├── package.json
│   │   └── src
│   ├── package2
│   │   ├── package.json
│   │   └── src
│   └── package3
│       ├── package.json
│       └── src
├── services
│   ├── service1
│   │   ├── app.yaml
│   │   ├── Dockerfile
│   │   ├── package.json
│   │   └── src
│   └── service2
│       ├── app.yaml
│       ├── Dockerfile
│       ├── package.json
│       └── src
└── yarn.lock

和 运行 类似于:gcloud app deploy services/service1/app.yaml --build-context=.

但我没有在文档中看到任何执行此操作的方法。

你知道我怎样才能更接近我的"dream solution"吗?

添加评论中建议的可能选项以提供更多可见性。

一种可能性是保留您正在使用的 docker-compose 工作流并将其与您的 App Engine 部署集成。

由于您已经使用 docker-compose 构建 docker 图像以指定构建上下文,因此您可以 push the result of the build operations to Google's Container Registry so the images can be later used to deploy App Engine by using the --image-url flag.