如何从检查docker集装箱中抓取暴露的港口?

假设我使用以下命令启动docker容器

docker run -d --name my-container -p 1234 my-image 

并运行docker ps显示该图像的端口绑定是…

 80/tcp, 443 /tcp. 0.0.0.0:32768->1234/tcp 

有没有一种方法,我可以使用docker inspect抓住被分配映射到1234端口(在这种情况下,32768)?

类似于使用以下命令parsing和获取IP地址…

 IP=$(docker inspect -f "{{ .Networksettings.IPAddress }} my-container) 

我希望能够做到类似于以下内容

 ASSIGNED_PORT=$(docker inspect -f "{{...}} my-container) 

我不知道是否有方法通过Docker做到这一点,但我会想象有一些命令行的魔术(grep,sed等)可以让我做这样的事情。

当我运行docker inspect my-container并看看NetworkSettings …我看到以下内容

 "NetworkSettings": { ... ... ... "Ports": { "1234/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "32768" } ], "443/tcp": null, "80/tcp": null }, ... ... }, 

在这种情况下,我希望它findHostPort而不告诉任何有关端口1234(它应该忽略443和80下面),并返回32768

执行命令: docker inspect --format="{{json .Config.ExposedPorts }}" src_python_1

结果: {"8000/tcp":{}}

certificate(使用docker ps ):

 e5e917b59e15 src_python:latest "start-server" 22 hours ago Up 22 hours 0.0.0.0:8000->8000/tcp src_python_1 

根据你的口味有两个很好的select: docker port my-container 1234 | grep -o [0-9]*$ docker port my-container 1234 | grep -o [0-9]*$docker inspect --format='{{(index (index .NetworkSettings.Ports "1234/tcp") 0).HostPort}}' my-container

这是不容易的,因为一个容器可以有多个端口,一些暴露,一些没有,但是这将得到它:

 sudo docker inspect name | grep HostPort | sort | uniq | grep -o [0-9]* 

如果有多个端口被暴露,它将显示在一个新的行上。

我已经用docker inspect <container>docker inspect <container>| jq docker inspect <container>| jq组合docker inspect <container>| jq端口。

在下面的例子中,我正在寻找dsb-server容器和我正在寻找的端口是8080 / tcp

 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98b4bec33ba9 xxxxx:dsbv3 "./docker-entrypoint." 6 days ago Up 6 days 8009/tcp, 0.0.0.0:4848->4848/tcp, 8181/tcp, 0.0.0.0:9013->8080/tcp dsb-server 

去除港口

 docker inspect dsb-server| jq -r '.[].NetworkSettings.Ports."8080/tcp"[].HostPort' 

9013

 docker inspect --format='{{(index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort}}' 

9013