如何将主机IP地址传递给Docker Compose文件?
如何将主机IP地址传递给Docker Compose文件?
我正在使用docker-compose(文件1)构建一个应用程序,想知道如何将主机IP地址传递给docker-compose文件。该应用程序由一个数据库、一个前端和一个后端组成。我希望能够从本地网络上的其他计算机访问我的应用程序。前端部分工作正常,但当我想与后端通信时,就不再工作了。我怀疑这是因为前端试图将数据发送到localhost(这对于本地网络上的其他计算机来说不是正确的)。因此,我想在docker-compose文件中直接向前端应用程序传递主机的IP地址,以便它可以与后端通信!有什么想法吗?\n文件1\n 版本:\"3.7\"\n 服务:\n db:\n 构建:\n 上下文:./database\n 命令:--default-authentication-plugin=mysql_native_password --sql_mode=\"\"\n 重启:始终\n cap_add:\n - SYS_NICE # CAP_SYS_NICE\n 卷:\n - db_data:/var/lib/mysql\n 端口:\n - ${MYSQL_PORT}:${MYSQL_PORT}\n 环境:\n MYSQL_DATABASE:${MYSQL_DATABASE}\n MYSQL_PASSWORD:${MYSQL_PASSWORD}\n MYSQL_ROOT_PASSWORD:${MYSQL_ROOT_PASSWORD}\n MYSQL_TCP_PORT:${MYSQL_PORT}\n env_file:./.env\n back:\n 依赖:\n - db\n 构建:\n 上下文:./backend\n 目标:development\n 卷:\n - ./backend:/app\n - /app/node_modules\n 重启:\"no\"\n 端口:\n - ${BACKEND_PORT}:${BACKEND_PORT}\n env_file:./.env\n front:\n 依赖:\n - back\n - db\n 构建:\n 上下文:./frontend\n 目标:development\n stdin_open:true\n 卷:\n - ./frontend:/app\n - /app/node_modules\n 重启:\"no\"\n 端口:\n - ${FRONTEND_PORT}:${FRONTEND_PORT}\n env_file:./.env\n 卷:\n db_data:{}\n
\n这是我在前端环境中使用的API URL与后端通信,我希望能够动态替换为主机的IP。\n文件2\n
const dev = { ...env, apiUrl: "http://localhost:3000/api", };
\n非常感谢你的帮助!\n最好的祝愿
问题的原因是,需要将主机的IP地址传递给Docker Compose文件。解决方法是通过在特定服务的环境变量中添加HOST_IP=http://host.docker.internal:PORT,然后在Node.js代码中通过访问环境变量来访问Docker内部的主机IP。
具体的解决方法如下:
在Docker Compose文件中的特定服务的环境变量中添加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末尾。这个解决方法只适用于开发环境,不适用于生产环境。
问题的原因是Docker Compose不支持命令替换(command substitution),只支持静态的shell变量(shell variable expansion)。解决方法之一是在compose文件中声明必需的变量,并提供适当的错误消息。另一种解决方法是使用envsubst来就地编辑compose文件。同时需要注意,"host's ip address"这个术语并不存在,它是一个非常模糊的概念。在编写命令来定义"host's IP"时需要小心,最好确保命令返回你期望的结果。
以下是解决方法的具体代码示例:
# 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}
另外,可以使用以下命令来获取主机的IP地址:
ip route get 1 | awk '{print $NF;exit}'
参考链接中还提到了使用`envsubst`命令来编辑compose文件的方法,具体示例可以参考链接中的回答。最后,需要注意的是,"host's ip address"并不是一个准确的术语,它是一个相当模糊的概念。在简单的网络配置中,上述命令可能能够正常工作,但最好还是检查并确保命令返回你期望的结果。
问题的原因是希望能够动态地将主机的 IP 地址传递给 Docker Compose 文件,而不是每次在新的网络上手动指定 IP 地址。为了解决这个问题,可以使用环境变量来传递配置信息。首先,在 Node 代码中可以通过 `process.env` 获取环境变量。然后,在 `docker-compose.yml` 文件中可以直接设置 URL,其中的环境变量可以在代码中定义,默认值为 `http://localhost:3000/api`。
以下是解决方法的代码示例:
在 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
感谢 David 的回答,这正是我想要的,但我还希望能够动态地添加 IP 地址 `10.20.30.40/api`,而不是每次在新的网络上手动指定 IP 地址。不确定是否可能实现。