如何将主机IP地址传递给Docker Compose文件?

8 浏览
0 Comments

如何将主机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最好的祝愿

0
0 Comments

问题的原因是,需要将主机的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末尾。这个解决方法只适用于开发环境,不适用于生产环境。

0
0 Comments

问题的原因是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"并不是一个准确的术语,它是一个相当模糊的概念。在简单的网络配置中,上述命令可能能够正常工作,但最好还是检查并确保命令返回你期望的结果。

0
0 Comments

问题的原因是希望能够动态地将主机的 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 地址。不确定是否可能实现。

0