gpt4 book ai didi

java - Docker - 在 Java 应用程序中获取绑定(bind)端口

转载 作者:IT老高 更新时间:2023-10-28 21:20:48 26 4
gpt4 key购买 nike

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

docker run -P webmodule-xy

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

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

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

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

Allowing a container to have access to the REST API is problematic. For one thing, the REST API is read/write, and if all you need is to read your portmappings, that's a dangerous level of permissions to grant a container just to find out a few ports.

最佳答案

一旦容器运行,您应该可以使用 docker inspect为了得到通过-P选项映射到主机上的端口号。

One can loop over arrays and maps in the results to produce simple text output:

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

Find a Specific Port Mapping

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

I now want to get to know this random port inside the java app which runs in the container.

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

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

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

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

  • a docker exec 将在 docker run 之后,将从 docker inspect 读取的端口添加为环境变量并运行Java 应用程序(issue 8838):

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

关于java - Docker - 在 Java 应用程序中获取绑定(bind)端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com