解决方法到docker运行"--env-file"提供的文件没有按预期进行评估

rik*_*nor 9 docker

我目前运行docker容器的设置如下:

  1. 我有一个main.env档案:
# Main
export PRIVATE_IP=\`echo localhost\`
export MONGODB_HOST="$PRIVATE_IP"
export MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
  1. 在我的服务文件(upstart)中,我获取此文件 . /path/to/main.env

  2. 然后我docker run使用multiple -e来调用容器内部的每个环境变量.在这种情况下,我会称之为:docker run -e MONGODB_URL=$MONGODB_URL ubuntu bash

  3. 然后我会期望MONGODB_URL容器内部相等mongodb://localhost:27017/development.请注意,实际上echo localhostcurl亚马逊的api 替换为实际的PRIVATE_IP.

当您开始拥有需要为容器提供的越来越多的环境变量时,这会变得有点笨拙.这里有一个很好的观点,即环境变量需要在运行时解析,例如调用curl或引用其他env变量.

我希望使用的解决方案是:

  1. docker run使用如下--env-file参数调用:
# Main
PRIVATE_IP=\`echo localhost\`
MONGODB_HOST="$PRIVATE_IP"
MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
  1. 然后我的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 /发展"

我可以通过执行以下操作来规避这一点:

  1. 采购main.env文件.
  2. 创建一个只包含我想要的变量名称的文件(意味着docker会在环境中搜索它们).
  3. 然后docker run使用此文件作为参数调用--env-file.这可行,但意味着我需要维护两个文件而不是一个,并且实际上不会对当前情况有所改善.

我更喜欢的是让变量按预期解析.

我能找到的最接近我的问题是: 使用Docker进行12factor配置

小智 8

所以我也遇到了这个问题,为我解决的是我在容器映像名称之前指定了 --env-file 或 -e KEY=VAL 。例如

破碎的:

docker run my-image --env-file .env
Run Code Online (Sandbox Code Playgroud)

固定的:

docker run --env-file .env my-image
Run Code Online (Sandbox Code Playgroud)


Gur*_* BN 5

  • 创建 .env 文件
 example: test=123 val=Guru
Run Code Online (Sandbox Code Playgroud)
  • 执行命令

docker run -it --env-file=.env bash

  • 在 bash 内部验证使用

echo $test (应该打印 123)


Usm*_*ail 4

和设置变量均按原样设置--env--env-file并且不会替换嵌套变量。

Solomon Hykes讨论了在运行时配置容器以及各种方法。应该对您有用的方法是将 main.env 从主机批量安装到容器中并获取它。