我目前运行docker容器的设置如下:
main.env
个文件:# Main export PRIVATE_IP=\`echo localhost\` export MONGODB_HOST="$PRIVATE_IP" export MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
在我的服务文件(新贵)中,我提供了此文件. /path/to/main.env
然后,我为容器内部的每个环境变量调用docker run
多个-e
。在这种情况下,我会称之为:docker run -e MONGODB_URL=$MONGODB_URL ubuntu bash
我希望容器内的MONGODB_URL
等于mongodb://localhost:27017/development
。请注意,实际上echo localhost
被curl
替换为亚马逊的实际PRIVATE_IP
api。
当您开始拥有需要为容器提供的越来越多的环境变量时,这会变得有点笨拙。这里有一个很好的观点,即环境变量需要在运行时 解决,例如调用curl
或通过引用到其他env变量。
我希望使用的解决方案是:
docker run
参数调用--env-file
,例如:# Main PRIVATE_IP=\`echo localhost\` MONGODB_HOST="$PRIVATE_IP" MONGODB_URL="mongodb://$MONGODB_HOST:27017/development"
docker run
命令将大大缩短为docker run --env-file=/path/to/main.env ubuntu bash
(请记住,我通常会有大约12-15个环境变量。这是我遇到问题的地方,即容器内没有任何变量按预期解析。相反,我最终得到:
我可以通过以下方式来解决这个问题:
main.env
文件。docker run
的参数调用--env-file
。这可行,但意味着我需要维护两个文件而不是一个,并且真的不会对当前情况有所改善。我更喜欢的是让变量按预期解析。
我能找到的最接近我的问题是: 12factor config approach with Docker
答案 0 :(得分:4)
--env
和--env-file
设置变量,并且不替换嵌套变量。
Solomon Hykes讨论了在运行时配置容器以及各种方法。适合您的方法是将main.env从主机批量安装到容器中并进行采购。
答案 1 :(得分:1)
example: test=123 val=Guru
docker run -it --env-file = .env 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_USER
和ADMIN_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