【问题标题】:How to get the host ip dynamically in a docker-compose file?如何在 docker-compose 文件中动态获取主机 ip?
【发布时间】:2017-09-15 08:54:52
【问题描述】:

对于 docker 开发环境,我们使用的是 docker-compose-file。一切正常,我们真的很高兴,但是我想解决一个小问题:

我们用 xdebug 安装 php-fpm。现在我们配置如下:

PHP-Dockerfile:

FROM php:7.1-fpm

RUN docker-php-ext-install pdo_mysql \
&& docker-php-ext-install json \
&& pecl install xdebug \
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini

docker-compose.yml:

services:
  //[...]
  php:
    build: ./docker/php/
    container_name: dev-php
    expose:
      - 9000
    volumes:
      - .:/var/www/html
    environment:
      XDEBUG_CONFIG: remote_host=192.168.0.50
      PHP_IDE_CONFIG: "serverName=docker"

此设置运行良好:我们可以在本地系统的 IDE 中使用 xdebug 进行调试。唯一的问题是,我们在 docker-compose-file 中保存了一个静态 IP“192.168.0.50”。所以每个员工在运行前都得把它改成自己的IP...

现在的问题是: 构建时是否有更智能的方法来动态获取主机 IP 地址?

【问题讨论】:

  • 相当无关的问题:为什么需要暴露9000 端口?您是否尝试从外部连接到 php-fpm?它提供什么?
  • 我正在使用 phpstorm,我需要这个端口用于 xdebug。
  • 感谢您的链接,Tarun。我会牢记在心,以备不时之需。目前,您使用 ssh 隧道的解决方案对我来说有点太复杂了,因为我想让事情变得简单...... ;)
  • “我正在使用 phpstorm,我需要这个端口用于 xdebug” 但是...... 1)它是 xdebug 连接到 IDE(传出连接)而不是其他方式...因此您不需要公开 xdebug 端口... 2)您说您正在使用 php-fpm ...默认情况下它也使用 TCP 9000 端口...所以如果有的话...您将暴露 php-fpm 而不是 xdebug...

标签: php docker docker-compose xdebug


【解决方案1】:

没有“魔术命令”可以获取主机 IP 地址,因此解决此问题的唯一方法是使用环境变量解决方案:

services:
  //[...]
   php:
     build: ./docker/php/
     container_name: dev-php
   expose:
     - 9000
   volumes:
     - .:/var/www/html
   environment:
     XDEBUG_CONFIG: remote_host=${WORKER_IP}
     PHP_IDE_CONFIG: "serverName=docker"

然后通过.env文件传递这个变量:

https://docs.docker.com/compose/env-file/

您可以在文档中阅读更多内容:

https://docs.docker.com/compose/environment-variables/#configuring-compose-using-environment-variables.

祝你好运:)

【讨论】:

  • 您好 Krzysztof,感谢您的回复。不幸的是,docker-compose 没有为 docker-compose up (docs.docker.com/compose/reference/up) 提供“-e”属性。目前,对我来说唯一可行的方法是使用 env 文件,每个员工都必须自己设置
  • 是的,你是对的,很抱歉。答案已编辑。
【解决方案2】:

host.docker.internal

“从 18.03 开始​​,我们的建议是连接到特殊的 DNS 名称 host.docker.internal,它解析为主机使用的内部 IP 地址。这是出于开发目的,不适用于外部的生产环境Docker Desktop for Mac [或 Docker Desktop for Windows]"

docker-for-mac

docker-for-windows

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多