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

M15*_*156 9 java environment-variables docker

我正在创建一个像我的图像的实例

docker run -P webmodule-xy
Run Code Online (Sandbox Code Playgroud)

webmodule的Dockerfile公开了一个端口(例如8080).

我现在的目标是获取可通过Java从外部访问的映射/分配端口号.是否有环境变量或类似的东西?

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

我已经在GitHub上找到了这个未解决的问题,但我无法相信没有简单的解决方案.就像那里所说,REST不是一个选项:

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

Von*_*onC 7

容器运行后,您应该可以使用docker inspect-P选项来获取主机上映射的端口号.

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

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

查找特定的端口映射

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

我现在想要了解在容器中运行的java app中的这个随机端口.

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


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

  • a docker exec,之后docker run,将端口读取docker inspect作为环境变量添加并运行java app(issue 8838):

    docker exec -i CONTAINER_ID /bin/bash -c "export PORT=<port> && run_java-app"
    
    Run Code Online (Sandbox Code Playgroud)
  • java应用程序(来自容器内)将读取环境变量