docker run" - env-file"提供的文件未按预期评估

时间:2014-12-20 18:22:22

标签: docker

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

  1. 我有main.env个文件:
  2. # Main
    export PRIVATE_IP=\`echo localhost\`
    export MONGODB_HOST="$PRIVATE_IP"
    export MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
    1. 在我的服务文件(新贵)中,我提供了此文件. /path/to/main.env

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

    3. 我希望容器内的MONGODB_URL等于mongodb://localhost:27017/development。请注意,实际上echo localhostcurl替换为亚马逊的实际PRIVATE_IP api。

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

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

      1. 使用docker run参数调用--env-file,例如:
      2. # 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个环境变量。
        2. 这是我遇到问题的地方,即容器内没有任何变量按预期解析。相反,我最终得到:

          • PRIVATE_IP =`echo localhost`
          • MONGODB_HOST = “$ PRIVATE_IP”
          • MONGODB_URL = “mongodb的:// $ MONGODB_HOST:27017 /发展”

          我可以通过以下方式来解决这个问题:

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

            我能找到的最接近我的问题是: 12factor config approach with Docker

6 个答案:

答案 0 :(得分:4)

--env--env-file设置变量,并且不替换嵌套变量。

Solomon Hykes讨论了在运行时配置容器以及各种方法。适合您的方法是将main.env从主机批量安装到容器中并进行采购。

答案 1 :(得分:1)

  • Ceate a .env file
 example: test=123 val=Guru
  • 执行命令
  

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

  • 使用
  • 进行bash验证
  

echo $ test(应打印123)

答案 2 :(得分:0)

创建一个只有键/值对的ENV文件,可以在普通的shell命令中处理并附加到环境中。看看bash -a pragma。

答案 3 :(得分:0)

您可以做的是创建一个可在容器启动时运行的启动脚本。因此,如果您当前的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

答案 4 :(得分:0)

我有一个非常相似的问题。如果我将env文件的内容作为单独的-e指令传递给docker,则一切运行良好,但是如果我使用--env-file传递文件,则容器无法正常运行。

结果是文件中有一些虚假的行尾(我从Windows复制并在Ubuntu中运行了docker)。当我删除它们时,容器使用--env或--env-file运行相同的容器。

答案 5 :(得分:0)

在单独的运行脚本docker run文件中使用run.sh时遇到了这个问题,因为我希望可以在容器中访问凭据ADMIN_USERADMIN_PASSWORD,但是不会显示在命令中。

按照其他答案并使用--env--env-file传递单独的环境文件对我的图像无效(尽管它对Bash image有效)。有效的方法是创建一个单独的环境文件...

# env.list
ADMIN_USER='username'
ADMIN_PASSWORD='password'

...并在启动容器时在运行脚本中提供它:

# run.sh
source env.list
docker run -d \
    -e ADMIN_USER=$INFLUXDB_ADMIN_USER \
    -e ADMIN_PASSWORD=$INFLUXDB_ADMIN_PASSWORD \
    image_repo/name:tag