docker工人运行的解决方法“–env-file”提供的文件未按预期进行评估
我目前的运行docker集装箱的设置是这样的:
- 我有一个
main.env
文件:
#主要 导出PRIVATE_IP = \\ echo localhost \` export MONGODB_HOST =“$ PRIVATE_IP” export MONGODB_URL =“mongodb:// $ MONGODB_HOST:27017 / development”
-
在我的服务文件(新贵),我源这个文件
. /path/to/main.env
. /path/to/main.env
-
然后我调用
docker run
与多个-e
为我想在容器内的每个环境variables。 在这种情况下,我会打电话:docker run -e MONGODB_URL=$MONGODB_URL ubuntu bash
-
然后,我希望
MONGODB_URL
内的MONGODB_URL
等于mongodb://localhost:27017/development
。 请注意,实际上,echo localhost
被一个curl
replace为一个实际的PRIVATE_IP
amazon api。
当你开始有越来越多的环境variables需要给你的容器时,这会变得有些笨拙。 这里有一个很好的观点,那就是环境variables需要在运行时解决,例如调用curl
或引用其他envvariables。
我希望使用的解决scheme是:
- 调用
docker run
一个--env-file
参数如下:
#主要 PRIVATE_IP = \\ echo localhost \` MONGODB_HOST = “$ PRIVATE_IP” MONGODB_URL = “的MongoDB:// $ MONGODB_HOST:27017 /发展”
- 然后我的
docker run
命令将显着缩短docker run --env-file=/path/to/main.env ubuntu bash
(请记住通常我有12-15左右的环境variables。
这是我打我的问题,这是在容器内没有任何变数如预期解决。 相反,我最终:
- PRIVATE_IP =`echo localhost`
- MONGODB_HOST = “$ PRIVATE_IP”
- MONGODB_URL = “的MongoDB:// $ MONGODB_HOST:27017 /发展”
我可以通过执行以下操作来绕过这个问题:
- 采购
main.env
文件。 - 创build一个只包含我想要的variables名称的文件(意思是docker会在环境中search它们)。
- 然后调用
docker run
这个文件作为参数--env-file
。 这将工作,但意味着我将需要保持两个文件,而不是一个,真的不会是现状的改善大的。
我更喜欢的是让variables按预期解决。
我能find的最接近的问题是: 使用Docker的12factorconfiguration方法
--env
和--env-file
设置variables都是,不能代替嵌套variables。
所罗门·海克斯(Solomon Hykes)谈到在运行时configuration容器以及各种方法。 一个应该为你工作的是将main.env从主机卷装到容器中并采购它。
创build一个无非是键/值对的ENV文件可以在正常的shell命令中处理并附加到环境中。 看看bash – 一个杂注。
你可以做的是创build一个启动脚本,可以在容器启动时运行。 所以如果你当前的docker文件看起来像这样
From ... ... CMD command
将其更改为
From ... ... ADD start.sh start.sh CMD ["start.sh"]
在你的start.sh脚本中执行以下操作:
export PRIVATE_IP=\`echo localhost\` export MONGODB_HOST="$PRIVATE_IP" export MONGODB_URL="mongodb://$MONGODB_HOST:27017/development" command