如何在注入docker容器之前评估主机上的环境变量bash表达?

时间:2019-04-10 18:07:36

标签: docker docker-compose

我有一个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表达式?

1 个答案:

答案 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,则只需查看容器内的默认网关地址即可(该地址对应于容器所连接的主机上的桥接设备的地址)。