Я хочу получить 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-адрес?
Заранее спасибо:)