docker - 如何在注入 docker 容器之前评估主机上的环境变量 bash 表达式?
问题描述
我有一个docker-compose.yml
文件,我在其中定义了许多服务。其中一项服务需要特定于主机的环境变量(例如本地 WiFi 网络上的设备 IP)。与其硬编码,我更喜欢使用 bash 表达式,它在评估时将返回正确的值。
似乎传递此类环境变量的正确方法是通过放置在当前工作目录中的dot -env 文件。请参阅下面的当前代码:
码头工人-compose.yml:
version: '3.1'
services:
...
mobile:
build:
context: .
dockerfile: Dockerfile.mobile
command: bash -c "export BASE_URL=$$(node base_url.js)
&& npm start --lan"
environment:
- REACT_NATIVE_PACKAGER_HOSTNAME=${HOST_DEVICE_IP}
depends_on:
- ngrok
ports:
# Expose Metro Bundler
- 19001:19001
# Expose Expo DevTools
- 19002:19002
# Expose App
- 19000:19000
.env:
HOST_DEVICE_IP=$(ipconfig getifaddr en0)
但是,当使用 docker-compose 启动服务时,REACT_NATIVE_PACKAGER_HOSTNAME
envvar 的值为$(ipconfig getifaddr en0)
。换句话说,.env
文件没有评估表达式,而是作为字符串注入。
TLDR:如何将环境变量传递到容器中,其中值可以是在主机上评估的 bash 表达式?
解决方案
HOST_DEVICE_IP
从您的文件中删除.env
,而是在运行时在命令行上设置它docker-compose up
:
HOST_DEVICE_IP=$(ipconfig getifaddr en0) docker-compose up -d
但我想知道你是否真的需要这个?如果您使用的是 Mac 或 Windows,则可以使用特殊的主机名host.docker.internal
来引用 Docker 主机。如果您使用的是 Linux,您只需查看容器内的默认网关地址(这将对应于容器所连接的主机上的桥接设备的地址)。
推荐阅读
- scala - 数据帧中的引用列在连接两个数据帧时抛出不明确的错误,其中一个数据帧具有一组引用键
- google-sheets - 谷歌表格 TEXT() 公式打破小数
- r - 使用其上方行中字符串的第一个单词重命名该行中的字符串
- windows - 无法更改文本框文本 XAML、C++/CX:未声明的标识符
- mysql - 如何使用 mySQL、Django、vueJS 处理带有海量数据的 rest api
- regex - 两组分隔符中字符串的正则表达式
- rust - Rust Cargo 不会自动编译工作空间中的依赖项目
- .net - IEnumerable 提取代码延迟加载显示 Stream 不可读
- c# - 如何对这个功能进行单元测试?
- python - 使用 Pandas 将 str 转换为浮点、舍入然后转换为 int 的简单方法?