docker工人运行的解决方法“–env-file”提供的文件未按预期进行评估

我目前的运行docker集装箱的设置是这样的:

  1. 我有一个main.env文件:
  #主要
导出PRIVATE_IP = \\ echo localhost \`
 export MONGODB_HOST =“$ PRIVATE_IP”
 export MONGODB_URL =“mongodb:// $ MONGODB_HOST:27017 / development” 
  1. 在我的服务文件(新贵),我源这个文件. /path/to/main.env . /path/to/main.env

  2. 然后我调用docker run与多个-e为我想在容器内的每个环境variables。 在这种情况下,我会打电话: docker run -e MONGODB_URL=$MONGODB_URL ubuntu bash

  3. 然后,我希望MONGODB_URL内的MONGODB_URL等于mongodb://localhost:27017/development 。 请注意,实际上, echo localhost被一个curlreplace为一个实际的PRIVATE_IP amazon api。

当你开始有越来越多的环境variables需要给你的容器时,这会变得有些笨拙。 这里有一个很好的观点,那就是环境variables需要在运行时解决,例如调用curl或引用其他envvariables。

我希望使用的解决scheme是:

  1. 调用docker run一个--env-file参数如下:
  #主要
 PRIVATE_IP = \\ echo localhost \`
 MONGODB_HOST = “$ PRIVATE_IP”
 MONGODB_URL = “的MongoDB:// $ MONGODB_HOST:27017 /发展” 
  1. 然后我的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 /发展”

我可以通过执行以下操作来绕过这个问题:

  1. 采购main.env文件。
  2. 创build一个只包含我想要的variables名称的文件(意思是docker会在环境中search它们)。
  3. 然后调用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