首页 > 解决方案 > 使用 ~/.bashrc 中的 shell 脚本获取容器的 IP 地址

问题描述

我想获取容器的 IP 地址,我环顾四周并选择在我的~/.bashrc

docker_ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

但是因为容器是通过自定义网络连接的,如下所示:

"NetworkSettings": {
        "Bridge": "",
        "SandboxID": "e5b42ebd28c5e00e72ab1b7036bf4b1def4036f75ef66994d14a895fd82929bf",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {},
        "SandboxKey": "/var/run/docker/netns/e5b42ebd28c5",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "",
        "Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "",
        "IPPrefixLen": 0,
        "IPv6Gateway": "",
        "MacAddress": "",
        "Networks": {
            "mynet": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": [
                    "0819292faeb4"
                ],
                "NetworkID": "4d63adc0879a36550310b50d284718772fe81d01d4ec19a6dc919ad7817c1a3d",
                "EndpointID": "5bfa1bbaa2c446bc5e93d4f14628b8b9e482dd876ae9b89d558fdcc7cf7d0da1",
                "Gateway": "172.18.0.1",
                "IPAddress": "172.18.0.5",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:42:ac:12:00:05",
                "DriverOpts": null
            }
        }
    }

IP不在

.NetworkSettings.IPAddress

但在 :

.NetworkSettings.Networks.${network_name}.IPAddress

由于${network_name}不固定,我必须修改shell脚本~/.bashrc来解析网络名称,代码~/.bashrc如下:

function docker_ip(){
    IP=".NetworkSettings.IPAddress" #initialize IP by the default path
    while getopts "n:c:" OPT # n represents custom network name and c represents container ID
    do
         case "$OPT" in
              "n") IP=".NetworkSettings.Networks.${OPTARG}.IPAddress" ;;
              #if n is followed by an argument, it indicates that the network is customized, and thus the default path is replaced.
              "c") containerID=${OPTARG};;
              "?") echo "unrecognized option";;
         esac
    done
    echo"${IP}"
    echo"${containerID}"
    sudo docker inspect --format "{{${IP}}}" ${containerID} #to get the container's IP
}

该脚本的主要思想是,如果使用以下参数调用函数:

$docker_ip -n ${network name} -c containerID

然后脚本将用于.NetworkSettings.Networks.${network_name}.IPAddress获取 IP 地址。如果没有参数,例如:

docker_ip -p containerID

表示容器是默认连接网络的,那么脚本会.NetworkSettings.IPAddress用来获取IP地址。

虽然这不能正常工作。当我输入$docker_ip -n mynet -c 0819shell 提示时,输出应该是:

$docker_ip -n mynet -c 0819
.NetworkSettings.Networks.mynet.IPAddress
0819
172.18.0.5

而实际上输出如下:

$docker_ip -n mynet -c 0819
.NetworkSettings.IPAddress
0819

如您所见,由于路径应该是.NetworkSettings.Networks.mynet.IPAddress而不是.NetworkSettings.IPAddress所以无法找到容器 0819 的 IP 地址。

为什么这个变量不能改变?我是shell脚本的新手,所以我想知道这样做是否正确,最好的方法是什么?另外,有没有更简单的方法来获取 IP 地址?提前致谢 :)

标签: shelldockercontainers

解决方案


推荐阅读