我有一个docker-compose.yml
文件,其中定义了许多服务。其中一项服务需要特定于主机的环境变量(例如,本地WiFi网络上设备的IP)。与其进行硬编码,不如使用bash表达式,该表达式在被评估时将返回正确的值。
似乎传递此类环境变量的正确方法是通过dot-env file placed in the current working directory。请参阅下面的当前代码:
docker-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表达式?
答案 0 :(得分:1)
从HOST_DEVICE_IP
文件中删除.env
,然后在运行docker-compose up
时在命令行上进行设置:
HOST_DEVICE_IP=$(ipconfig getifaddr en0) docker-compose up -d
但是我想知道您是否真的需要这个?如果您使用的是Mac或Windows,则可以使用特殊的主机名host.docker.internal
来引用Docker主机。如果您使用的是Linux,则只需查看容器内的默认网关地址即可(该地址对应于容器所连接的主机上的桥接设备的地址)。