Terraform:为输出指定特定的Docker网络名称

Terraform:为输出指定特定的Docker网络名称,terraform,terraform-provider-docker,Terraform,Terraform Provider Docker,我有一个集装箱网络功能(CNF),连接到三个Docker网络: ... ip_address = "172.17.0.3" ip_prefix_length = 16 ipc_mode = "private" log_driver = "json-file" log_opts = {} logs

我有一个集装箱网络功能(CNF),连接到三个Docker网络:

    ...
    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”]而不是索引号?

由于您的代码示例不完整,我不得不在这里进行一些猜测,但似乎您需要的是从网络名称到IP地址的映射。您可以使用从资源配置派生出这样的数据结构,您可以将其分配给a以在配置中的其他位置使用:

locals {
  container_ip_addresses = {
    for net in docker_container.c-router-52.network_data :
    net.network_name => net.ip_address
  }
}
使用模块中的上述定义,您可以在模块中的其他位置引用
local.container\u ip\u地址
来引用此映射,例如
local.container\u ip\u地址[“外部网络”]
来访问
外部网络
地址

使用配置中显示的
网络\u数据
结构,
本地.container\u ip\u地址
将具有以下值:

{
  bridge      = "172.17.0.3"
  inside-net  = "172.31.0.4"
  outside-net = "172.30.0.3"
}
如果您需要访问那些
网络\u数据
对象的其他属性,而不仅仅是
ip\u地址
,您可以通过将映射的值设置为完整的网络对象来概括这一点:

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

由于您的代码示例不完整,我不得不在这里稍作猜测,但似乎您需要的是从网络名称到IP地址的映射。您可以使用从资源配置派生出这样的数据结构,您可以将其分配给a以在配置中的其他位置使用:

locals {
  container_ip_addresses = {
    for net in docker_container.c-router-52.network_data :
    net.network_name => net.ip_address
  }
}
使用模块中的上述定义,您可以在模块中的其他位置引用
local.container\u ip\u地址
来引用此映射,例如
local.container\u ip\u地址[“外部网络”]
来访问
外部网络
地址

使用配置中显示的
网络\u数据
结构,
本地.container\u ip\u地址
将具有以下值:

{
  bridge      = "172.17.0.3"
  inside-net  = "172.31.0.4"
  outside-net = "172.30.0.3"
}
如果您需要访问那些
网络\u数据
对象的其他属性,而不仅仅是
ip\u地址
,您可以通过将映射的值设置为完整的网络对象来概括这一点:

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

感谢您的详细回复!比您指给我的实际Terraform文档页面要好:)谢谢您的详细回复!比你指给我的Terraform文档页面要好:)