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

z9ju0rcb  于 2022-12-11  发布在  Docker
关注(0)|答案(7)|浏览(180)

我当前运行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
1.然后,我调用docker run,其中包含多个-e,用于容器中的每个环境变量。docker run -e MONGODB_URL=$MONGODB_URL ubuntu bash
1.然后我期望容器内的MONGODB_URL等于mongodb://localhost:27017/development,注意实际上echo localhost被amazon的API中的curl替换为实际的PRIVATE_IP
当你有越来越多的环境变量需要给予你的容器时,这就变得有点笨拙了。这里有一个很好的地方需要注意,那就是环境变量需要在运行时***被解析***,比如通过调用curl或者通过引用其他env变量。
我希望使用的解决方案是:
1.使用--env-file参数调用docker run,如下所示:

# 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='回显本地主机'
  • MONGODB_主机="$私有IP”
  • 开发人员可以通过浏览器访问MONGODB_URL=“MONGODB://$MONGODB_HOST:27017/开发”

我可以通过执行以下操作来规避此问题:
1.获取main.env文件。
1.创建一个只包含所需变量名称的文件(意味着Docker将在环境中搜索它们)。
1.然后用这个文件作为--env-file的参数调用docker run,这样做是可行的,但这意味着我需要维护两个文件而不是一个,而且对当前的情况没有多大的改善。
我更希望变量按预期解决。
我能找到的最接近我的问题是:12factor config approach with Docker

kgqe7b3p

kgqe7b3p1#

  • 创建.env文件
example: test=123 val=Guru
  • 执行命令

docker运行-it --环境文件=.env bash

  • 在bash内部使用以下命令进行验证

echo $test(应打印为123)

68de4m5k

68de4m5k2#

--env--env-file都按原样设置变量,并且不替换嵌套变量。
所罗门Hykes讨论了在运行时配置容器的各种方法。应该对您有效的方法是将主机中的main.env卷安装到容器中并获取它。

ilmyapht

ilmyapht3#

创建一个ENV文件,它只不过是键/值对,可以在普通的shell命令中处理并附加到环境中。

mpgws1up

mpgws1up4#

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

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
zsohkypk

zsohkypk5#

我遇到了一个非常类似的问题。如果我把env文件的内容作为单独的-e指令传递给docker,那么一切都运行得很好,但是如果我用--env-file传递文件,容器就不能正常运行了。
结果发现文件中有一些虚假的行尾(我从windows复制并在Ubuntu中运行docker)。当我删除它们时,容器运行相同的--env或--env-file。

57hvy0tb

57hvy0tb6#

我在单独的运行脚本run.sh文件中使用docker run时遇到了这个问题,因为我希望在容器中可以访问凭据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
nx7onnlm

nx7onnlm7#

所以我也遇到了这个问题,我解决这个问题的方法是在容器映像的名称之前指定--env-file或-e KEY=瓦尔**。
破碎:

docker run my-image --env-file .env

已修复:

docker run --env-file .env my-image

相关问题