使用正则表达式来获取docker容器端口号

时间:2017-05-16 07:40:56

标签: bash docker

所以我试图从我的docker集群中获取一个特定的端口号,这样做是因为我稍后需要该端口。

当我做docker-compose ps时,我得到以下输出

contaimer_db_1            docker-entrypoint.sh mysqld      Up      3306/tcp
container_node_1          /usr/bin/supervisord -n          Up      0.0.0.0:3902->3902/tcp
container_php_1           docker-php-entrypoint php-fpm    Up      9000/tcp
container_redis_1         docker-entrypoint.sh redis ...   Up      6379/tcp

我想得到的是来自container_node_1 3902的端口号

到目前为止,我得到了

docker-compose ps | grep "[ :]\?[[:digit:]]\{4\}"

但是这将获得所有端口,因为它们连续有4个数字。我该如何更改它以确保它只能获得节点端口?

如果有任何帮助,节点容器将始终显示为0.0.0.0:1234->1234

2 个答案:

答案 0 :(得分:3)

单独使用Awk并两次调用split()功能

docker-compose ps | awk '$1=="container_node_1"{n=split($NF,arr1,"->"); split(arr1[n],arr2,"/"); print arr2[1]}'

会按预期提供端口号。这适用于安装的所有 POSIX符合Awk

如果您安装了GNU Awk,则可以使用其gensub()函数执行正则表达式匹配并提取端口号,

docker-compose ps | awk '$1=="container_node_1"{print gensub(/.*->([[:digit:]]+)\/(.+)$/,"\\1","g",$NF)}'

RegEx Demo用于内部使用的正则表达式。

答案 1 :(得分:1)

I would rather use docker inspect

example

docker-compose ps

Name Command State Ports

dockerpartkeepr_database_1 docker-entrypoint.sh mysqld Up 3306/tcp
dockerpartkeepr_partkeepr_1 docker-php-entrypoint apac ... Up 0.0.0.0:80->80/tcp

So I will try to get the port linked to 80

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

which will show

80

see my answer How to get ENV variable when doing Docker Inspect

for more explanations