首页 > 解决方案 > 如何在注入 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_HOSTNAMEenvvar 的值为$(ipconfig getifaddr en0)。换句话说,.env文件没有评估表达式,而是作为字符串注入。

TLDR:如何将环境变量传递到容器中,其中值可以是在主机上评估的 bash 表达式?

标签: dockerdocker-compose

解决方案


HOST_DEVICE_IP从您的文件中删除.env,而是在运行时在命令行上设置它docker-compose up

HOST_DEVICE_IP=$(ipconfig getifaddr en0) docker-compose up -d

但我想知道你是否真的需要这个?如果您使用的是 Mac 或 Windows,则可以使用特殊的主机名host.docker.internal来引用 Docker 主机。如果您使用的是 Linux,您只需查看容器内的默认网关地址(这将对应于容器所连接的主机上的桥接设备的地址)。


推荐阅读