Reactjs 获取容器';dockerfile中的IP

Reactjs 获取容器';dockerfile中的IP,reactjs,api,docker,Reactjs,Api,Docker,我正在使用docker容器运行reactjs应用程序,我们正在使用模拟API和UI。我在一个docker容器中作为两个单独的进程运行它们。但是,在reactjs应用程序的.env文件中,环境变量映射到localhost,如下所示:- REACT_APP_MOCK_API_URL="http://localhost:8080/API" REACT_APP_MOCK_API_URL_AUTH="http://localhost:8080/API/AUTH" REACT_APP_MOCK_API_UR

我正在使用docker容器运行reactjs应用程序,我们正在使用模拟API和UI。我在一个docker容器中作为两个单独的进程运行它们。但是,在reactjs应用程序的.env文件中,环境变量映射到localhost,如下所示:-

REACT_APP_MOCK_API_URL="http://localhost:8080/API"
REACT_APP_MOCK_API_URL_AUTH="http://localhost:8080/API/AUTH"
REACT_APP_MOCK_API_URL_PRESENTATION="http://localhost:8080/API/PRESENTATION"
因为docker容器的IP是动态的,所以我需要用容器在运行时创建的动态IP覆盖它

我可以知道在dockerfile里怎么做吗

PS:我试着在docker文件中为这些环境变量分配静态IP,它可以工作。但是,我不知道如何动态地获取IP并在dockerfile内部传递它

请帮忙


谢谢

这本质上不是可以直接在Dockerfile中设置的。您通常根本不关心容器内部IP地址:从其他容器中,您应该使用Docker的内部DNS服务,从容器外部,您可以通过主机的IP地址访问已发布的端口(
Docker run-p
选项)

在许多情况下,您可以从HTTP头中收集足够的信息,以便在应用程序中构造有效的链接。您可以将这些变量设置为,例如,
REACT\u APP\u MOCK\u API\u URL=“/API”
;如果它是相对于应用程序中的其他URL进行解释的,那么它将继承正确的主机名

如果这些都不起作用,您可以使用入口点脚本来设置这些变量。这可能看起来像:

#/垃圾箱/垃圾箱
如果[-n“$URL_PREFIX”];然后
#设置这三个变量(如果尚未设置)
:${REACT_APP_MOCK_API_URL:=“${URL_PREFIX}/API}
:${REACT\u APP\u MOCK\u API\u URL\u AUTH:=“${URL\u PREFIX}/API/AUTH”}
:${REACT_APP_MOCK_API_URL_PRESENTATION:=“${URL_PREFIX}/API/PRESENTATION”}
#将它们导出到其他进程
导出REACT\u APP\u MOCK\u API\u URL REACT\u APP\u MOCK\u API\u URL\u AUTH
导出REACT\u APP\u MOCK\u API\u URL\u演示文稿
fi
#启动主容器命令
执行官“$@”
在Dockerfile中,您将
复制
此脚本,并将其作为
入口点运行

。。。
复制docker-entrypoint.sh/
入口点[“/docker ENTRYPOINT.sh”]
CMD[…]
然后,当您最终运行容器时,您可以动态地注入URL前缀,包括您选择的任何端口

docker run-e URL_PREFIX=“http://$(主机名):3456”-p 3456:8080。。。
入口点脚本将根据
URL\u前缀
变量设置其他变量,然后运行docker文件中设置为
CMD
或在
docker run
命令行中命名的任何命令。(如果您运行docker-it…sh,,则入口点将运行,并在最后一步启动交互式shell,这对调试非常有用。)

这本质上不是您可以直接在Dockerfile内设置的内容。您通常根本不关心容器内部IP地址:从其他容器中,您应该使用Docker的内部DNS服务,从容器外部,您可以通过主机的IP地址访问已发布的端口(
Docker run-p
选项)

在许多情况下,您可以从HTTP头中收集足够的信息,以便在应用程序中构造有效的链接。您可以将这些变量设置为,例如,
REACT\u APP\u MOCK\u API\u URL=“/API”
;如果它是相对于应用程序中的其他URL进行解释的,那么它将继承正确的主机名

如果这些都不起作用,您可以使用入口点脚本来设置这些变量。这可能看起来像:

#/垃圾箱/垃圾箱
如果[-n“$URL_PREFIX”];然后
#设置这三个变量(如果尚未设置)
:${REACT_APP_MOCK_API_URL:=“${URL_PREFIX}/API}
:${REACT\u APP\u MOCK\u API\u URL\u AUTH:=“${URL\u PREFIX}/API/AUTH”}
:${REACT_APP_MOCK_API_URL_PRESENTATION:=“${URL_PREFIX}/API/PRESENTATION”}
#将它们导出到其他进程
导出REACT\u APP\u MOCK\u API\u URL REACT\u APP\u MOCK\u API\u URL\u AUTH
导出REACT\u APP\u MOCK\u API\u URL\u演示文稿
fi
#启动主容器命令
执行官“$@”
在Dockerfile中,您将
复制
此脚本,并将其作为
入口点运行

。。。
复制docker-entrypoint.sh/
入口点[“/docker ENTRYPOINT.sh”]
CMD[…]
然后,当您最终运行容器时,您可以动态地注入URL前缀,包括您选择的任何端口

docker run-e URL_PREFIX=“http://$(主机名):3456”-p 3456:8080。。。
入口点脚本将根据
URL\u前缀
变量设置其他变量,然后运行docker文件中设置为
CMD
或在
docker run
命令行中命名的任何命令。(如果您
docker run-it…sh
,入口点将运行,并在最后一步启动交互式shell,这对调试非常有用。)

感谢您的回复。这真的很有帮助。我还有一个问题,如果我将MOCK_API和UI作为两个独立的服务运行,并将覆盖上面帖子中列出的环境变量,我可以知道如何做到吗???基本上,我需要将运行MOCK_API的服务与UI服务链接起来,还需要覆盖env变量以成功登录UI…感谢您的回复。这真的很有帮助。我还有一个问题,如果我将MOCK_API和UI作为两个独立的服务运行,并将覆盖上面帖子中列出的环境变量,我可以知道如何做到吗???基本上,我需要将运行MOCK_API的服务与UI服务链接起来,还需要覆盖env变量以成功登录UI。。。