Sed 如何从检查docker容器中获取暴露的端口?

Sed 如何从检查docker容器中获取暴露的端口?,sed,grep,docker,dockerfile,Sed,Grep,Docker,Dockerfile,假设我使用以下命令启动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) 类似于使用以下命令解析和获取IP地址 IP=$(docker inspect -f "{{ .Networkse

假设我使用以下命令启动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)

类似于使用以下命令解析和获取IP地址

IP=$(docker inspect -f "{{ .Networksettings.IPAddress }} my-container)
我希望能够做类似以下的事情

ASSIGNED_PORT=$(docker inspect -f "{{...}} my-container)
"NetworkSettings": {
        ...
        ...
        ...
        "Ports": {
            "1234/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "32768"
                }
            ],
            "443/tcp": null,
            "80/tcp": null
        },
        ...
        ...
    },
我不确定是否有办法通过Docker做到这一点,但我可以想象有一些命令行魔法(grep、sed等)可以让我做类似的事情

当我运行
docker时,检查我的容器
并查看
网络设置
…我看到以下内容

ASSIGNED_PORT=$(docker inspect -f "{{...}} my-container)
"NetworkSettings": {
        ...
        ...
        ...
        "Ports": {
            "1234/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "32768"
                }
            ],
            "443/tcp": null,
            "80/tcp": null
        },
        ...
        ...
    },

在本例中,我希望它在不告诉它任何关于端口1234的信息的情况下找到HostPort(它应该忽略它下面的443和80),并返回
32768

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

结果:
{“8000/tcp”:{}

证明(使用docker ps):


根据您的喜好,有两个很好的选择:
docker-port my container 1234 | grep-o[0-9]*$
docker-inspect--format={{(index(index.NetworkSettings.port“1234/tcp”)0.HostPort}}我的容器

使用ip地址并不容易,因为一个容器可以有多个端口,有些是暴露的,有些不是暴露的,但这会得到它:

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

如果暴露了多个端口,它将显示在新行上。

我使用了
docker inspect
docker inspect | jq
组合来剥离端口

在下面的示例中,我查看的是dsb服务器容器,我要查找的端口是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

9013使用jq:

docker inspect --format="{{json .}}" my-container | jq '.NetworkSettings.Ports["1234/tcp"][0].HostPort'

使用您在docker run中指定的端口更改1234,上面的答案很接近,让我走上了正确的轨道,但我一直遇到以下错误:

模板分析错误:模板::1:操作数中出现意外“/”

我在这里找到了答案:

这就是最终对我起作用的原因:

docker inspect --format="{{(index (index .NetworkSettings.Ports \"80/tcp\") 0).HostPort}}" $INSTANCE_ID

我手头没有docker提示符,是什么提供了
docker inspect-f'{.NetworkSettings.Port}}'容器id
(我们将改进),也许您可以尝试
docker inspect--format'{(index(index.NetworkSettings.Port“1234/tcp”)0.HostPort}
container\u id'在@user2915097
NetworkSettings中查看我的答案。端口无法工作(请参阅我在上面对
docker-inspect
@user2915097的输出所做的编辑。我已经更新了上面的问题。我不想告诉它
1234
,因为我可能不知道。当docker-inspect更深入时,它需要找到1234/tcp下的内容,当然你可以随时使用jq和管道grepCould更新此内容以获取最新信息。)端口,以便我可以将其分配给变量?@jedicowboy,现在的问题是如何将结果解析为Shell脚本数组,因为容器可能有许多暴露的端口。我将对此进行研究。到目前为止,我知道的是,
docker insepct--format
使用返回结果。实际上,这从se获取了暴露的端口号容器内的服务-它不会向您显示主机端口,即如何从docker机器IP访问服务。Alen Komljen()和Travis Reeder()的解决方案是解决OP问题的正确答案。