[英]Compute Engine Deploy Container
我正在使用 golang 以编程方式创建和销毁使用Compute Engine API的一次性 Compute Engine 实例。
我可以很好地创建一个实例,但我真正遇到的问题是在启动时启动一个容器。
您可以从控制台 UI 执行此操作:
但据我所知,以编程方式执行此操作非常困难,尤其是使用 Container Optimized OS 作为基础映像时。 我尝试做一个启动脚本,它执行docker pull us-central1-docker.pkg.dev/project/repo/image:tag
但它失败了,因为你需要做gcloud auth configure-docker us-central1-docker.pkg.dev
首先让它工作,COOS 没有 gcloud 也没有 package 经理来获取它。
我所有的解决方法似乎都很老套:
我是否遗漏了什么,或者在不使用 gcloud 或控制台 UI 的情况下将容器部署到计算引擎实例真的很麻烦吗?
要在 Compute Engine 启动时让 Compute Engine 启动容器,必须为容器的描述定义元数据。 当 COOS 启动时,它似乎运行了一个名为 konlet 的应用程序,可在此处找到:
https://github.com/GoogleCloudPlatform/konlet
如果我们查看文档,它会说:
代理解析存储在 gce-container-declaration 键下的 VM 实例元数据中的容器声明,并使用声明的配置选项启动容器。
不幸的是,我还没有找到有关此元数据结构的任何正式文档。 虽然我找不到文档,但我确实找到了两种可能的解决方案:
或者
您提到您使用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
还需要其他步骤吗? 谢谢。
事实证明,在 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
这似乎是以编程方式使用容器配置实例的最简单的方法。
我最近遇到了这些限制的另一面(并就该主题提出了一个问题)。
基本上,我想在不启动容器的情况下配置 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 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.