首页 > 解决方案 > Terraform docker 无法使用远程主机的容器注册表进行身份验证

问题描述

我在使用 Terraform 0.13.4 的 Windows 机器上,并尝试使用 Terraform 和 Docker 提供程序在远程主机上启动一些容器:

provider "docker" {
  host = "tcp://myvm:2376/"

  registry_auth {
    address = "myregistry:443"
    username = "myusername"
    password = "mypassword"
  }

  ca_material = file(pathexpand(".docker/ca.pem"))
  cert_material = file(pathexpand(".docker/cert.pem"))
  key_material = file(pathexpand(".docker/key.pem"))
}

data "docker_registry_image" "mycontainer" {
  name = "myregistry:443/lvl1/lvl2/myimage:latest"
}

我很难做到这一点,因为它无法通过我的私人注册表进行身份验证。总是越来越401 Unauthorized

如果我不这样做来获取sha256_digest并仅使用docker_container资源,那么一切正常,但它会强制替换正在运行的容器。

标签: dockerterraformterraform-provider-docker

解决方案


你好 Angelos,如果你不想强制更换正在运行的容器,你应该试试这个:

provider "docker" {
  host = "tcp://myvm:2376/"

  registry_auth {
    address = "myregistry:443"
    username = "myusername"
    password = "mypassword"
  }

  ca_material = file(pathexpand(".docker/ca.pem"))
  cert_material = file(pathexpand(".docker/cert.pem"))
  key_material = file(pathexpand(".docker/key.pem"))
}
data "docker_registry_image" "mycontainer" {
  name = "myregistry:443/lvl1/lvl2/myimage:latest"
}

resource "docker_image" "example" {
  name = data.docker_registry_image.mycontainer.name
  pull_triggers = [data.docker_registry_image.mycontainer.sha256_digest]
  keep_locally = true
}

然后在容器中使用:

resource "docker_container" "example" {
  image = docker_image.example.latest
  name = "container_name"
   
}

你应该使用

docker_image.example.latest

使用资源 docker_image 本身,如果它已经存在,他将不会拉取图像并且不会重新启动容器,但是如果您将名称作为字符串传递,他将每次都替换容器。

https://www.terraform.io/docs/providers/docker/r/container.html


推荐阅读