Докер Terraform не может аутентифицироваться в реестре контейнеров для удаленного хоста
Я нахожусь на машине с Windows, использую Terraform 0.13.4 и пытаюсь развернуть некоторые контейнеры на удаленном хосте с помощью 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
ресурс, все работает, но требует замены работающих контейнеров.
2 ответа
Оказывается, код правильный, и служба контейнера, которую я использую (более старая версия ProGet), не отвечает правильно на вызовы аутентификации. Я протестировал код, используя другой реестр, и все работает как положено.
Привет, Анджелос, если вы не хотите принудительно заменять работающий контейнер, попробуйте следующее:
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