docker run的变通方法--环境文件;提供的文件未按预期进行评估

docker run的变通方法--环境文件;提供的文件未按预期进行评估,docker,Docker,我当前运行docker容器的设置如下: 我有一个main.env文件: 然后我的docker-run命令将显著缩短为docker-run--env-file=/path/to/main.env-ubuntu-bash(请记住,通常我有12-15个环境变量 这就是我遇到的问题所在,即在容器中没有一个变量按预期解决。相反,我最终得到: PRIVATE_IP=`echo localhost` MONGODB_主机=“$PRIVATE_IP” MONGODB_URL=“MONGODB://$MONGO

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

  • 我有一个
    main.env
    文件:
  • 然后我的
    docker-run
    命令将显著缩短为
    docker-run--env-file=/path/to/main.env-ubuntu-bash
    (请记住,通常我有12-15个环境变量
  • 这就是我遇到的问题所在,即在容器中没有一个变量按预期解决。相反,我最终得到:

    • PRIVATE_IP=`echo localhost`
    • MONGODB_主机=“$PRIVATE_IP”
    • MONGODB_URL=“MONGODB://$MONGODB_主机:27017/development”
    我可以通过以下方式规避这一问题:

    export PRIVATE_IP=\`echo localhost\`
    export MONGODB_HOST="$PRIVATE_IP"
    export MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
    command
    
  • 查找
    main.env
    文件
  • 创建一个只包含我想要的变量名称的文件(这意味着docker将在环境中搜索它们)
  • 然后调用
    docker run
    ,将此文件作为
    --env file
    的参数。这会起作用,但意味着我需要维护两个文件,而不是一个文件,并且对当前情况的改善不会太大
  • 我更喜欢的是让变量按照预期的方式解析

    我能找到的最接近我的问题是: 既要按原样设置变量,也不要替换嵌套变量


    讨论了在运行时配置容器以及各种方法。对您来说,最有效的方法是将main.env从主机批量装载到容器中,并将其寻源。

    创建一个只不过是键/值对的env文件可以在普通shell命令中处理并附加到环境中。查看bash-a pragma.

    您可以做的是创建一个启动脚本,该脚本可以在容器启动时运行

    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
    
    • 创建一个.env文件
    • 执行命令
    docker run-it--env file=.env bash

    • 在bash内部,使用
    echo$测试(应打印123)


    我遇到了一个与此非常类似的问题。如果我将env文件的内容作为单独的-e指令传递给docker,那么一切都会正常运行。但是,如果我使用--env file传递文件,则容器无法正常运行


    原来文件中有一些虚假的行尾(我从windows复制并在Ubuntu中运行docker)。当我删除它们时,容器与--env或--env文件运行相同。

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

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

    # 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
    

    我注意到您的
    main.env
    正在将VAR设置为文字字符串。您是否尝试删除
    &
    ?您可以在此处阅读有关Docker如何处理文字的更多信息:根据env文件语法,应该是简单的key=value项。不确定在您的情况下如何处理“导出”。“源代码”“这意味着您需要bash或其他shell,这意味着容器中有大量的垃圾,而在我的情况下,我只需要可执行文件
    # 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