получить IP-адрес контейнера с помощью сценария оболочки в ~ / .bashrc - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу получить 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} не исправлено, мне нужно изменить скрипт оболочки в ~/.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 0819 в командной строке, вывод должен быть:

$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, поэтому IP-адрес контейнера 0819 не может быть найден.

Почему эта переменная не может измениться? Я новичок в создании сценариев, поэтому я хотел знать, правильно ли это делать и как лучше всего это сделать? Кроме того, есть ли более простой способ получить IP-адрес? Заранее спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...