我目前运行docker容器的设置如下:
>我有一个main.env文件:
# Main export PRIVATE_IP=\`echo localhost\` export MONGODB_HOST="$PRIVATE_IP" export MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
>在我的服务文件(upstart)中,我获取此文件. /path/to/main.env
>然后,我为容器内部的每个环境变量调用多个-e的docker run.在这种情况下,我会称之为:docker run -e MONGODB_URL = $MONGODB_URL ubuntu bash
>然后我希望容器内的MONGODB_URL等于mongodb:// localhost:27017 / development.请注意,实际上,echo localhost被一个curl替换为amazon的api,用于实际的PRIVATE_IP.
当您开始拥有需要为容器提供的越来越多的环境变量时,这会变得有点笨拙.这里有一个很好的观点,即环境变量需要在运行时解析,例如调用curl或引用其他env变量.
我希望使用的解决方案是:
>使用–env-file参数调用docker run,例如:
# Main PRIVATE_IP=\`echo localhost\` MONGODB_HOST="$PRIVATE_IP" MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
>然后我的docker run命令会大大缩短到docker run –env-file = / path / to / main.env ubuntu bash(请记住,我通常有大约12-15个环境变量.
这是我遇到问题的地方,即容器内没有任何变量按预期解析.相反,我最终得到:
> PRIVATE_IP =`echo localhost`
> MONGODB_HOST =“$PRIVATE_IP”
> MONGODB_URL =“mongodb:// $MONGODB_HOST:27017 / development”
我可以通过以下方式来规避这个问题:
>采购main.env文件.
>创建一个只包含我想要的变量名称的文件(意味着docker会在环境中搜索它们).
>然后调用docker运行此文件作为–env-file的参数.这可行,但意味着我需要维护两个文件而不是一个,并且真的不会对当前情况有很大改善.
我更喜欢的是让变量按预期解析.
我能找到的最接近我的问题是:
12factor config approach with Docker
Solomon Hykes讨论了在运行时配置容器以及各种方法.适合您的方法是将main.env从主机批量安装到容器中并进行采购.