我当前运行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
7条答案
按热度按时间kgqe7b3p1#
docker运行-it --环境文件=.env bash
echo $test(应打印为123)
68de4m5k2#
--env
和--env-file
都按原样设置变量,并且不替换嵌套变量。所罗门Hykes讨论了在运行时配置容器的各种方法。应该对您有效的方法是将主机中的main.env卷安装到容器中并获取它。
ilmyapht3#
创建一个ENV文件,它只不过是键/值对,可以在普通的shell命令中处理并附加到环境中。
mpgws1up4#
您可以做的是创建一个启动脚本,它可以在容器启动时运行。
更改为
在start.sh脚本中执行以下操作:
zsohkypk5#
我遇到了一个非常类似的问题。如果我把env文件的内容作为单独的-e指令传递给docker,那么一切都运行得很好,但是如果我用--env-file传递文件,容器就不能正常运行了。
结果发现文件中有一些虚假的行尾(我从windows复制并在Ubuntu中运行docker)。当我删除它们时,容器运行相同的--env或--env-file。
57hvy0tb6#
我在单独的运行脚本
run.sh
文件中使用docker run
时遇到了这个问题,因为我希望在容器中可以访问凭据ADMIN_USER
和ADMIN_PASSWORD
,但不在命令中显示。按照其他的答案,并传递一个单独的环境文件与
--env
或--env-file
没有工作,我的形象(虽然它的工作,为Bash image)。...并在启动容器时在运行脚本中获取它:
nx7onnlm7#
所以我也遇到了这个问题,我解决这个问题的方法是在容器映像的名称之前指定--env-file或-e KEY=瓦尔**。
破碎:
已修复: