为什么使用多个 Docker 主机时出现无法创建带有映像的容器无法拉取映像错误拉取映像?

  • 本文关键字:映像 错误 创建 主机 Docker docker terraform
  • 更新时间 :
  • 英文 :


我正在尝试使用terraform(0.12.24(和多个Docker提供程序(插件版本2.7.0(执行简单的部署。我使用下面的 terraform 模板的目标是将两个不同的容器部署到两个不同的启用 Docker 的主机上。

# Configure the Docker provider
provider "docker" {
host = "tcp://192.168.1.10:2375/"
}
provider "docker" {
alias = "worker"
host = "tcp://127.0.0.1:2375/"
}
# Create a container
resource "docker_container" "hello" {
image = docker_image.world.latest
name  = "hello"
}
resource "docker_container" "test" {
provider = docker.worker
image = docker_image.world.latest
name  = "test"
}
resource "docker_image" "world" {
name = "hello-world:latest"
}

docker命令在没有 root 权限的情况下成功运行。两台机器 192.168.1.10 和 127.0.0.1 的 Docker 守护进程都在 2375 上侦听,可从主机访问,并且可以响应使用 curl 执行的直接 Docker REST API 调用(创建、拉取等(。手动拉取映像在两个主机中也有效,我这样做是为了确保最新的hello-world映像存在于两个主机中。

但是,地形部署 (地形应用( 失败,并显示以下错误:

docker_container.hello: Creating...
docker_container.test: Creating...
docker_container.hello: Creation complete after 1s [id=77e515b4269aed255d4becac61f40d38e09838cdf8285294bf51f3c7cddbf2bf]
Error: Unable to create container with image sha256:a29f45ccde2ac0bde957b1277b1501f471960c8ca49f1588c6c885941640ae60: Unable to pull image sha256:a29f45ccde2ac0bde957b1277b1501f471960c8ca49f1588c6c885941640ae60: error pulling image sha256:a29f45ccde2ac0bde957b1277b1501f471960c8ca49f1588c6c885941640ae60: Error response from daemon: pull access denied for sha256, repository does not exist or may require 'docker login'
on test.tf line 17, in resource "docker_container" "test":
17: resource "docker_container" "test" {

为什么使用多个 Docker 主机时出现无法创建带有映像的容器无法拉取映像错误拉取映像?

docker_container.test引用docker_image.world,但它们使用不同的提供程序(defaultdocker.worker(:

resource "docker_container" "test" {
provider = docker.worker
image = docker_image.world.latest
name  = "test"
}
resource "docker_image" "world" {
name = "hello-world:latest"
}

这是致命的,因为docker_image.world使用提供的默认值,该默认值tcp://192.168.1.10:2375/上运行docker 拉取(而不是在 tcp://127.0.0.1:2375/上运行(。

可以通过使用提供程序docker.world_worker创建docker_image来匹配docker_container.test来解决此问题,如下所示:

resource "docker_container" "test" {
provider = docker.world_worker
image = docker_image.world.latest
name  = "test"
}
resource "docker_image" "world_worker" {
provider = docker.world_worker
name = "hello-world:latest"
}

问题中最初使用的模板存在一些问题。 首先,使用短期运行的hello-world容器,这导致至少一个服务退出并显示Terraform的错误消息。 然后,在@Alain O'Dea的重要帮助下(见相关答案和评论(,我创建了以下修改后的模板,该模板有效并实现了我的目标。

# Configure the Docker provider
provider "docker" {
host = "tcp://192.168.1.10:2375/"
}
provider "docker" {
alias = "worker"
host = "tcp://127.0.0.1:2375/"
}
# Create a container
resource "docker_container" "hello" {
image = docker_image.world.latest
name  = "hello"
}
resource "docker_container" "test" {
provider = docker.worker
image = docker_image.world_image.latest
name  = "test"
}
resource "docker_image" "world" {
name = "prom/prometheus:latest"
}
resource "docker_image" "world_image" {
provider = docker.worker
name = "nextcloud:latest"
}

最新更新