shell - 使用 ~/.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 0819
shell 提示时,输出应该是:
$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 地址?提前致谢 :)
解决方案
推荐阅读
- c# - .Net 应用程序:数据库连接最佳实践
- android - 将两个项目限制在线性布局内的顶部和底部
- macos - 通过 macOS 本机应用程序中的 SwiftUI WKWebView 调用时,如何使文件打开对话框正常工作?
- database - 如何在页面加载时从代码后面设置模板字段标签文本属性?
- javascript - 使用 Ecmascript 6 和 webpack 导入模块时重构代码以避免 ciruclar 依赖
- google-cloud-platform - Google 管理员:无法重定向主域
- ios - 将可选图像 UIImageView 传递给另一个视图控制器
- unix - 在正确目录中以所有者身份调用文件但未找到
- python - Python Selenium 查找 url 并切换到下一页
- javascript - 如何在JS中的元素后插入元素