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

时间:2015-11-02 14:03:39

标签: java docker environment-variables

我正在创建我的图像实例,如

docker run -P webmodule-xy

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

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

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

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

  

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

1 个答案:

答案 0 :(得分:7)

容器运行后,您应该可以使用docker inspect来获取 System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); WebDriver driver = new ChromeDriver(); 选项在主机上映射的端口号。

  

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

-P
  

查找特定端口映射

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

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

详见“Docker, how to get container information from within the container?”,您可以:

  • 通过检查$ HOSTNAME env var。
  • 找出缩短的泊坞码
  • 使用Docker Remote API

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

Since using Docker Remote API from a container is problematic(由于可写访问权限),您可以考虑adding the port as a variable environment

  • GET /containers/<docker_id>/json HTTP/1.1 将在docker exec之后添加从docker run读取的端口作为环境变量并运行java app(issue 8838):< / p>

    docker inspect
  • java app(来自容器内)将读取环境变量