为什么在使用多个Docker主机时无法创建带有图像的容器无法提取图像错误提取图像?

时间:2020-05-14 20:06:00

标签: 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图像在两个主机中都存在。

但是,terraform部署(应用terraform)失败,并出现以下错误:

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主机时,无法创建带有图像的容器,无法提取图像错误?

2 个答案:

答案 0 :(得分:1)

docker_container.test 引用 docker_image.world ,但是它们使用不同的提供程序(默认 docker.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上运行 docker pull :2375 / (不在 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"
}

答案 1 :(得分:0)

最初在问题中使用的模板存在一些问题。 首先,使用了运行时间短的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"
}