0

我有一个连接到三个 Docker 网络的容器化网络功能 (CNF):

    ...
    ip_address        = "172.17.0.3"
    ip_prefix_length  = 16
    ipc_mode          = "private"
    log_driver        = "json-file"
    log_opts          = {}
    logs              = false
    max_retry_count   = 0
    memory            = 4096
    memory_swap       = -1
    must_run          = true
    name              = "c-router-52"
    network_data      = [
        {
            gateway          = "172.17.0.1"
            ip_address       = "172.17.0.3"
            ip_prefix_length = 16
            network_name     = "bridge"
        },
        {
            gateway          = "172.31.0.1"
            ip_address       = "172.31.0.4"
            ip_prefix_length = 16
            network_name     = "inside-net"
        },
        {
            gateway          = "172.30.0.1"
            ip_address       = "172.30.0.3"
            ip_prefix_length = 16
            network_name     = "outside-net"
        },
    ]
    network_mode      = "default"
    ...

我正在尝试获取“外网”IP 地址以用作另一个容器的输入。我这样指定:

${docker_container.c-router-52.network_data[2].ip_address}

当它是第三个元素时,它可以正常工作....但问题是 Terraform(或 Docker,两者之一)并不总是将“外部网络”作为第三个网络:(

有没有办法指定 [network_name="outside-net"] 而不是索引号?

4

1 回答 1

2

由于您的代码示例不完整,我不得不在这里猜测一下,但看起来您想要的是从网络名称到 IP 地址的映射。您可以使用for表达式从资源配置中派生出这样的数据结构,您可以将其分配给本地值以在配置的其他地方使用:

locals {
  container_ip_addresses = {
    for net in docker_container.c-router-52.network_data :
    net.network_name => net.ip_address
  }
}

通过你的模块中的上述定义,你可以参考local.container_ip_addresses你模块中的其他地方来引用这个映射,例如local.container_ip_addresses["outside-net"]访问outside-net特定的地址。

使用network_data您在配置中显示的结构,local.container_ip_addresses将具有以下值:

{
  bridge      = "172.17.0.3"
  inside-net  = "172.31.0.4"
  outside-net = "172.30.0.3"
}

如果您需要访问这些network_data对象的其他属性,而不仅仅是ip_address,您可以通过使映射的值成为完整的网络对象来概括这一点:

locals {
  container_networks = {
    for net in docker_container.c-router-52.network_data :
    net.network_name => net
  }
}

...这将允许您通过网络名称键访问所有属性:

local.container_networks["outside-net"].ip_address
local.container_networks["outside-net"].gateway
local.container_networks["outside-net"].ip_prefix_length
于 2020-09-16T23:36:41.940 回答