我如何将主机IP地址传递给Docker撰写文件?



我正在使用docker-compose(文件1)构建一个应用程序,我想知道如何将主机IP地址通信到docker-compose文件。该应用程序由数据库、前端和后端组成。它的目的是我想从本地网络上的其他计算机访问我的应用程序。它的工作很好,但当我想与后端通信,它不再工作了。我怀疑这是由于前端试图将数据发送到localhost(这不是本地网络上另一台计算机的正确数据)。因此,我想在docker-compose文件中直接与前端应用程序通信主机的IP地址,以便它可以与后端通信!你知道吗?

文件1

version: "3.7"
services:
db:
build: 
context: ./database
command: --default-authentication-plugin=mysql_native_password  --sql_mode=""
restart: always
cap_add:
- SYS_NICE  # CAP_SYS_NICE
volumes:
- db_data:/var/lib/mysql
ports:
- ${MYSQL_PORT}:${MYSQL_PORT}
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_TCP_PORT: ${MYSQL_PORT}
env_file: ./.env
back:
depends_on:
- db
build: 
context: ./backend
target: development
volumes: 
- ./backend:/app
- /app/node_modules
restart: "no"
ports:
- ${BACKEND_PORT}:${BACKEND_PORT}
env_file: ./.env
front:
depends_on:
- back
- db
build:
context: ./frontend
target: development
stdin_open: true
volumes:
- ./frontend:/app
- /app/node_modules
restart: "no"
ports:
- ${FRONTEND_PORT}:${FRONTEND_PORT}
env_file: ./.env
volumes:
db_data: {}

这是我在前端环境中使用的api url,用于与后端通信,我将动态替换为主机IP。

文件2

const dev = {
...env,
apiUrl: "http://localhost:3000/api",
};
非常感谢你的帮助!最好的

环境变量是传递像这样的小段配置的简单方法。

对于这种特殊情况,我可能会配置一个URL而不是主机的IP地址。您可能非常有理由希望将此应用程序部署在负载均衡器后面;负载均衡器可能会做TLS终止,所以你可以发布一个https:URL;您的本地IP地址可能无法从您的客户端直接访问;如果你有IP地址,你更愿意发布DNS名称而不是IP地址。

在Node代码中,您可以在process.env中找到环境变量:

const dev = {
...env,
apiUrl: process.env.API_URL || 'http://localhost:3000/api'
};
然后在你的docker-compose.yml你可以直接设置URL:
services:
front:
environment:
API_URL: http://10.20.30.40/api
# API_URL: https://example.com/myapp/api

您所需要的称为shell命令替换。
类似:MYVAR=$(ip route get 1 | awk '{print $NF;exit}')

不幸的是,在撰写中不支持命令替换。
Compose只支持"static"Shell变量又名Shell变量扩展。
最好的办法是声明强制变量与适当的错误消息。

# requires for the var to be pre-declared in shell
environment:
API_URL: ${API_URL:?"Variable API_URL must present in shell."}
# alternatively you could provide some default value
environment:
API_URL: ${API_URL:-192.0.2.2}

另一个解决方案可能是使用envsubst来就地编辑您的撰写文件。
检查这个答案中的例子。


还要注意,没有"主机的ip地址"这样的东西;:)
这是一个相当传统和模糊的术语。

"主要IP"是您的系统使用的任何东西的别名向默认路由发起流量。在没有来源的情况下短语在那条路由上,这是使用的接口的第一个地址(或多或少)。

因此,在编写命令来定义"主机的ip"时需要非常小心。
在简单的网络配置中,这个可能或多或少工作得很好。
ip route get 1 | awk '{print $NF;exit}'
但是最好检查一下这个讨论,并确保您最终的命令返回您所期望的。

添加HOST_IP=http://host.docker.internal:PORT在特定服务的环境变量中,如

environment:
- HOST_IP=http://host.docker.internal:4001/

你可以通过访问node js代码中的环境变量来访问docker中的主机ip,如

var host_url=process.env.HOST_IP

注意:因为你只能访问主机ip,你需要在url的末尾手动添加端口,它只适用于开发服务器,不适用于生产。

您应该在您的前端配置中添加一个环境变量,该变量指定api端点的URL,并在URL中使用后端容器的主机名。撰写网络的文档详细说明了容器的默认主机名和网络。

修改docker组合文件:

services:
front:
environment:
API_URL: http://back:${BACKEND_PORT}/api

修改你的javascript文件:

const dev = {
...env,
apiUrl: process.env.API_URL || 'http://localhost:3000/api'
};

最新更新