首页 > 解决方案 > 在 Makefile 中导出环境变量的问题

问题描述

我想在 Makefile 中导出环境变量。在这种情况下,就是用docker获取IP进行调试

生成文件

start:
    export XDEBUG_REMOTE_HOST=$$(/sbin/ip route|awk '/kernel.*metric/ { print $$9 }') \
    ; docker-compose up -d

从答案更新:

version: '3.5'

services:
  php:
      build:
        context: .
        dockerfile: docker/php/Dockerfile
      environment:
        - XDEBUG_CONFIG="idekey=docker"
        - XDEBUG_REMOTE_HOST=${XDEBUG_REMOTE_HOST}

输出:

$ make start
export XDEBUG_REMOTE_HOST=$(/sbin/ip route|awk '/kernel.*metric/ { print $9 }') \
; docker-compose up -d
Starting service_php           ... done

$ docker-compose exec php bash
WARNING: The XDEBUG_REMOTE_HOST variable is not set. Defaulting to a blank string.

标签: dockermakefiledocker-compose

解决方案


您需要确保变量赋值和docker命令在同一个 shell 中运行。简单地说,将它们放在相同的规则中:

start:
    XDEBUG_REMOTE_HOST=$$(/sbin/ip route|awk '/kernel.*metric/ { print $$9 }') \
    docker-compose up -d

我取出了,@因为这可能只是一个坏主意,特别是如果您需要了解这里发生了什么。如果您不想看到它在做什么,则可以在经过适当测试后使用make -sMakefile

的目的export是向子流程公开一个变量,但这不是必需的。相反,我们使用 shell 的通用

variable=value anothervar=anothervalue command

用于在单个命令期间设置变量值的语法。

如果内部docker-compose需要export编辑变量,那么当然,您也可以这样做:

start:
    export XDEBUG_REMOTE_HOST=$$(/sbin/ip route|awk '/kernel.*metric/ { print $$9 }') \
    ; docker-compose up -d

请注意命令列表第一行末尾的反斜杠如何将两个命令连接在一个逻辑行上,因此它们被传递到同一个 shell 实例,并且;需要命令分隔符来终止第一个命令。(我把分号放在行首是为了提醒读者这是一个命令行。)

具体来说docker-compose,从命令行设置变量的习惯方法是使用特定的命名选项;

start:
    docker-compose up -e XDEBUG_REMOTE_HOST=$$(/sbin/ip route|awk '/kernel.*metric/ { print $$9 }') -d

还有其他方法可以解决这个问题,例如 GNU Make.ONESHELL指令,但这简单明了,并且可以移植到任何 Make。


推荐阅读