【问题标题】:Get Host IP in Dockerfile在 Dockerfile 中获取主机 IP
【发布时间】:2018-02-22 06:20:12
【问题描述】:

我的 Dockerfile 中有一行:

&& echo "xdebug.remote_host=192.168.0.216" >> /usr/local/etc/php/conf.d/xdebug.ini`

我想让 IP 动态化。我如何获得那里的主机 IP?

【问题讨论】:

  • “主机IP”是什么意思?您在寻找 docker 主机 IP 吗?或者只是一种在容器运行时注入任何 IP 的方法?在容器构建时?
  • @Matt 正在运行 Docker 的计算机的 IP 地址

标签: docker dockerfile


【解决方案1】:

您需要使用build-time variables (–build-arg)。

此标志允许您传递像 Dockerfile 的 RUN 指令中的常规环境变量一样访问的构建时变量。

所以,Dockerfile 修改为:

ARG IP_ADDRESS
RUN ... && echo "xdebug.remote_host=$IP_ADDRESS" >> /usr/local/etc/php/conf.d/xdebug.ini`

而且你只需要在镜像构建过程中定义构建时变量IP_ADDRESS

$ docker build --build-arg IP_ADDRESS=<IP_ADDRESS> .

如果你使用docker-compose

1.创建文件.env,内容如下:

IP_ADDRESS="<IP_ADDRESS>"

你可以每次都这样(示例是 linux 机器):

IP_ADDRESS=$(ip a | grep <interface> | grep inet | awk '{print $2}' | awk -F'/' '{print $1}')
echo "IP_ADDRESS=$IP_ADDRESS" > .env

2. 使用以下docker-compose.yaml 构建您的映像:

version: '3'
services:
  myservice:
    build:
      context: .
      args:
        IP_ADDRESS: ${IP_ADDRESS} 

3. 构建上面的图像:

docker-compose build

【讨论】:

  • 对。也许我应该更具体。我正在使用 Docker Compose 运行容器
  • @Wildcard27 添加了如何通过docker-compose 实现目标的信息
  • 所以我不能用你的方法来解决这个问题。争论只是没有得到设置。我不得不猜测你在IP_ADDRESS=echo 之前有什么,因为它们不是 Dockerfile 命令。你能详细说明一下吗?
  • 我向您展示了如何获取主机 IP 并将其插入到.env 文件中的示例。之后,IP_ADDRESS 的值将被注入到 docker 镜像构建过程中。唯一需要使用主机接口(如em1)更改``。你可以完全避免这种情况。如果你知道某个主机的IP地址,你可以把它放到.env文件中,例如:echo "IP_ADDRESS=192.168.1.2" &gt; .env
  • 对。我假设您打算将 echo 放入 Dockerfile 中,因为您没有说明这两行应该放在哪里。那么他们应该去哪里呢?
【解决方案2】:

没有简单的内置方法来获取 Docker 主机 IP(除非您使用 Docker for Mac)

入口点

最好不要在构建时设置 Docker 主机 IP,否则镜像将绑定到它所构建的主机,并且无法在其他任何地方运行。

ENTRYPOINT 可用于根据环境变量进行配置设置,然后将所有命令传递给容器:

#!/bin/sh
if [ -n "$IP_ADDRESS" ]; then
  echo "xdebug.remote_host=$IP_ADDRESS" >> /usr/local/etc/php/conf.d/xdebug.ini
else
  echo "No environment variable IP_ADDRESS set for xdebug"
fi
exec "$@"

然后运行:

docker run -e IP_ADDRESS=192.168.51.5 me/app-debug

Docker for Mac

在 Docker for Mac 17.12+ 上,您可以使用主机名 docker.for.mac.host.internal

Xdebug

另一个选项是为 xdebug 设置 xdebug.remote_connect_back = 1 so you don't need a specific remote_host

构建

尼古拉的answer covers the build time setup

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多