通过 Terrafiom 将来自 DockerHub 的 Docker 图像部署为应用程序

Deploy Docker Image from DockerHub as App via Terrafiom

我正在尝试通过 Terraform 部署应用程序。我想使用来自 DockerHub.

我的 public 图片之一

DigitalOcean Provider 有效(通过其他 PoC 确认)。

现在我想将 Docker 图像部署为应用程序。我找到了 digitalocean_app 资源 (https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs/resources/app)。文档声明,我必须将“registry_type”设置为 DOCR(DigitalOcean 容器注册表)或 DOCKER_HUB.

之一

但我真的不知道怎么做。这是我的配置。

resource "digitalocean_app" "docs-page-docker-app" {
  spec {
    name   = "docs-page-docker-app"
    region = "fra1"

    # domain

    service {
      name      = "docs-page-docker-app-image"
      http_port = 3000

      image {
        registry_type = "DOCKER_HUB"
        repository    = "sommerfeldio/docs-website"
        tag           = "stable"
      }
    }
  }
}

当我将 DOCKER_HUB 放在引号 (") 中时,我总是收到错误消息“图像不存在或私有”。当我删除引号时,我的配置不再有效。

从文档中我真的不知道如何指定我想使用 DockerHub 作为容器注册表。有人知道我该如何解决这个问题吗?

我成功地 reverse-engineer 应用程序部署。我通过 WebUI 使用来自 DockerHub 的图像创建了一个 Docker 应用程序,并使用 terraform import 获取 terraform 配置。部署现在有效。

现在我 运行 遇到了一些 DNS 问题,但这在一个单独的问题中可能会更好。

这是允许将映像从 DockerHub 部署到 DigitalOcean App 平台的配置:

resource "digitalocean_app" "docs-page" {
  spec {
    domains = [
      "${digitalocean_record.CNAME-docs.name}.${digitalocean_domain.cloud.name}",
    ]
    name   = "docs-page"
    region = var.do_region

    service {
      name               = "docs-page-app"
      http_port          = 80
      instance_count     = 1
      instance_size_slug = var.do_instance_smallest
      internal_ports     = []
      #name               = "docs-page-app"
      source_dir = "/"

      image {
        registry_type = "DOCKER_HUB"
        registry      = "sommerfeldio"
        repository    = "docs-website"
        tag           = "stable"
      }

      routes {
        path                 = "/"
        preserve_path_prefix = false
      }
    }
  }
}

resource "digitalocean_domain" "cloud" {
  name = var.do_base_domain
}

resource "digitalocean_record" "CNAME-docs" {
  domain = digitalocean_domain.cloud.name
  type   = "CNAME"
  name   = "docs"
  value  = "@"
}