Docker – 在java应用程序中获取绑定的端口

我正在创build一个像我的形象的实例

docker run -P webmodule-xy 

webmodule的Dockerfile暴露一个端口(例如8080)。

我现在的目标是获得可以通过Java从外部访问的映射/分配的端口号。 有没有一个环境variables或类似的东西?

用例:webmodule-xy应该在另一个Web应用程序上注册自己,并提供其IP +端口,以便其他应用程序稍后可以联系webmodule-xy。 IP没问题,但是端口是。

我已经在GitHub上发现了这个开放的问题 ,但我不能相信没有简单的解决scheme。 就像在那里陈述的那样,REST不是一个select:

允许容器访问REST API是有问题的。 首先,REST API是可读/写的,如果你只需要读取你的portmappings,那么授权一个容器只是为了找出几个端口是一个危险的权限级别。

一旦容器正在运行,您应该能够使用docker inspect来获取通过-P选项映射到主机上的端口号。

可以在结果中遍历数组和映射来生成简单的文本输出:

 docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID 

find一个特定的端口映射

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

我现在想要知道这个在容器中运行的java应用程序中的随机端口。

如“ Docker中,如何从容器中获取容器信息? ”中所述,您可以:

  • 通过检查$ HOSTNAME env var找出一个短docker的docker id。
  • 使用Docker Remote API

     GET /containers/<docker_id>/json HTTP/1.1 

由于在容器中使用Docker Remote API是有问题的 (因为可写访问),所以可以考虑将端口添加为可变环境 。

  • 一个docker exec会在docker run ,将从docker inspect读取的端口添加为环境variables并运行java应用程序( 问题8838 ):

     docker exec -i CONTAINER_ID /bin/bash -c "export PORT=<port> && run_java-app" 
  • Java应用程序(从容器内)将读取环境variables