1

我正在使用 golang 使用Compute Engine API以编程方式创建和销毁一次性 Compute Engine 实例。

我可以很好地创建一个实例,但我真正遇到的问题是在启动时启动一个容器。

您可以从控制台 UI 执行此操作:

在此处输入图像描述

但据我所知,以编程方式执行此操作非常困难,尤其是使用容器优化操作系统作为基础映像时。我尝试做一个启动脚本,docker pull us-central1-docker.pkg.dev/project/repo/image:tag但它失败了,因为你需要先做gcloud auth configure-docker us-central1-docker.pkg.dev它才能工作,而 COOS 没有 gcloud 也没有包管理器来获取它。

我所有的解决方法似乎都很老套:

  • 手动创建具有所需容器的 VM 模板并创建模板的实例
  • 将容器放在外部注册表中,如 docker hub(不可接受)
  • 使用带有包管理器的 Ubuntu 而不是 COOS,这样我就可以在启动时以编程方式安装 gcloud、docker 和容器
  • 使用 COOS 从 dockerhub 中拉下包含 gcloud 的映像,然后执行某种 docker-in-docker mount 以将其拉下

我是否遗漏了什么,或者在不使用 gcloud 或控制台 UI 的情况下将容器部署到计算引擎实例真的很麻烦?

4

4 回答 4

1

你提到你曾经docker-credential-gcr解决你的问题。我在我的启动脚本中尝试了同样的方法:

docker-credential-gcr configure-docker --registries us-east1-docker.pkg.dev

但它返回:

ERROR: Unable to save docker config: mkdir /root/.docker: read-only file system

还需要其他步骤吗?谢谢。

于 2022-03-02T01:34:39.313 回答
1

事实证明,在 Container Optimized OS 中从 Artifact Registry 中拉取容器并不难:

  • docker-credential-gcr configure-docker --registries [region]-docker.pkg.dev

请参阅:https ://cloud.google.com/container-optimized-os/docs/how-to/run-container-instance#accessing_private_images_in_or

因此,您可以做的就是将上述行与启动脚本一起docker pull [image]放入docker run ...metadata您可以在使用以下字段创建实例时指定启动脚本: https ://cloud.google.com/compute/docs/instances/startup-scripts/linux#api

这似乎是以编程方式为实例提供容器的最简单的方法。

于 2021-11-12T04:47:48.390 回答
1

要让 Compute Engine 在 Compute Engine 启动时启动容器,必须为容器的描述定义元数据。当 COOS 启动时,它似乎运行了一个名为 konlet 的应用程序,可以在这里找到:

https://github.com/GoogleCloudPlatform/konlet

如果我们查看此文档,它会说:

代理解析存储在 gce-container-declaration 键下的 VM 实例元数据中的容器声明,并使用声明的配置选项启动容器。

不幸的是,我还没有找到任何有关此元数据结构的正式文档。虽然我找不到文档,但我确实找到了两种可能的解决方案:

  1. 破译konlet的源代码,拆开看看元数据如何映射到docker容器启动时传递的内容

或者

  1. 使用所需的容器定义手动创建 Compute Engine,然后启动 Compute Engine。通过 SSH 连接到 Compute Engine,然后检索当前的元数据。我们可以在这里阅读有关检索元数据的信息:

https://cloud.google.com/compute/docs/metadata/overview

于 2021-11-11T04:28:42.580 回答
0

我最近遇到了这些限制的另一面(并就该主题提出了一个问题)。

基本上,我想在启动容器的情况下提供 COOS 实例。我做不到,所以我只是从基础映像启动了一个容器,然后在我的 CI/CD 管道中,将我的应用程序 Docker 化,将其上传到 Artifact Registry 并用我新建的应用程序替换 COOS 实例上的基础映像。

我提供的元数据以将初始基础映像作为容器启动:

spec:
  containers:
    - image: blairnangle/python3-numpy-ta-lib:latest
      name: containervm
      securityContext:
        privileged: false
      stdin: false
      tty: false
      volumeMounts: []
      restartPolicy: Always
      volumes: []

我是 Terraform fanboi,因此元数据存在于某些 Terraform 配置中。如果您想正确查看,我有一个公共项目,其中包含实现此目的的代码:blairnangle/dockerized-flask-on-gce

于 2021-11-19T10:58:28.540 回答