docker - 在 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.
解决方案
您需要确保变量赋值和docker
命令在同一个 shell 中运行。简单地说,将它们放在相同的规则中:
start:
XDEBUG_REMOTE_HOST=$$(/sbin/ip route|awk '/kernel.*metric/ { print $$9 }') \
docker-compose up -d
我取出了,@
因为这可能只是一个坏主意,特别是如果您需要了解这里发生了什么。如果您不想看到它在做什么,则可以在经过适当测试后使用make -s
。Makefile
的目的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。
推荐阅读
- javascript - 将 Markdown 文件动态导入 Svelte 引发 404 错误
- android - StateFlow 汇集在一个协程中
- mysql - 获取总和小于或等于数据集中值的记录
- node.js - Sequelize + postgres,如何计算连接池大小?
- java - 如何在基于 Java 的 Android 应用程序中实现 Datastore?
- python - Python mypy 类型错误,可调用联合和可调用列表转换为可调用列表
- mysql - 在 Nodejs 中使用 SSH 连接 MySQL
- sql-server - 使用 sp_executesql 使用自动增量更新表
- javascript - 使用接口的空实例
- r - 如何在 R 中为列表中的多个值运行 ifelse 并在列表中的值与非列表中的值之间设置条件边界?