我正在创建我的图像实例,如
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,这是一个危险的权限级别 授予一个容器只是为了找到几个端口。
答案 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?”,您可以:
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(来自容器内)将读取环境变量