使用带有一堆-e标志甚至是.env的docker运行似乎很麻烦。有没有简单的方法可以将所有主机env变量传递给docker容器
js81xvg61#
我同意那些评论者的观点,他们认为你可能并不真正想做你认为你想做的事情。如果(a)您对带有特定前缀的环境变量感兴趣,并且(b)您的变量不包含任何空格,那么类似下面的操作就可以了......在这里,我将所有XDG_*变量公开给一个docker容器:
XDG_*
$ docker run -it --rm --env-file <(env | grep XDG) alpine sh / # env | grep XDG XDG_SEAT=seat0 XDG_SESSION_TYPE=x11 XDG_SESSION_ID=2 XDG_RUNTIME_DIR=/run/user/21937 XDG_MENU_PREFIX=gnome- XDG_CURRENT_DESKTOP=GNOME XDG_SESSION_DESKTOP=gnome XDG_VTNR=2
如果你真的想要 all 环境变量,你可能需要写一个更小的 Package 器程序来产生正确的带引号的输出(来处理包含空格的变量),并且排除跨多行的东西,比如BASH_FUNC_*变量,然后你可以用你的 Package 器来代替前面例子中的env | grep ...。
BASH_FUNC_*
env | grep ...
mznpcxlj2#
有两种方法可以使用-e标志:-e VAR=值和-e VAR;如果VAR已经被导出,那么第二种格式将使用导出的值,而不会使其公开可读,而且您不必担心对空格、引号等转义VALUE。所以如果你真的想把所有导出的变量都传递给你的容器,试试这个:
docker run ... $(env | cut -f1 -d= | sed 's/^/-e /') ...
gojuced73#
混合了@user3324033和@larsks的两个答案,下面是最适合我获取所有导出的环境变量和模拟奇点行为的答案:
docker run [...] --env-file <( env| cut -f1 -d= ) [...]
rvpgvaaj4#
我发现@larsks的回答很有启发性,但我发现我需要在如何向容器中注入变量方面做得更外科一些。如果您使用Makefile来构建和/或运行容器,您可以将gnu make的foreach关键字与env -i结合起来,轻松地将环境变量注入到容器中:
foreach
env -i
SHELL := /bin/bash FOO := myfooenv BAR := mybarenv VARS := FOO BAR run: docker run --rm -it \ --env-file <(env -i $(foreach var,$(VARS),$(var)=$($(var)))) \ bash:latest \ bash -c ' \ set -e; \ env; \ '
这将给予输出:
$ make run docker run --rm -it \ --env-file <(env -i FOO=myfooenv BAR=mybarenv) \ bash:latest \ bash -c ' \ set -e; \ env; \ ' HOSTNAME=9d3b6863b8f2 _BASH_VERSION=4.4 _BASH_LATEST_PATCH=23 PWD=/ HOME=/root FOO=myfooenv _BASH_GPG_KEY=7C0135FB088AAF6C66C650B9BB5869F064EA74AB TERM=xterm SHLVL=1 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin BAR=mybarenv _BASH_PATCH_LEVEL=18 _=/usr/bin/env
toe950275#
从安全性的Angular 来说,这可能是最不理想的答案,但如果其他方法都失败了,我会采取这样的方法:env > env.txt; docker run -it [...] --env-file env.txt [...]; rm env.txt假设你是以交互式会话的形式运行它,如果你是以后台服务的形式运行它,那么处理env.txt的清理就不同了。您可以在命令链中设置文件的RW权限,也许是为了使其更安全,并将;切换为&&,以便更好地执行命令我自己也尝试过其他的解决方案,但没有成功(我在Mac OS上,如果有区别的话,我会通过brew使用bash 4)。
env > env.txt; docker run -it [...] --env-file env.txt [...]; rm env.txt
;
&&
5条答案
按热度按时间js81xvg61#
我同意那些评论者的观点,他们认为你可能并不真正想做你认为你想做的事情。
如果(a)您对带有特定前缀的环境变量感兴趣,并且(b)您的变量不包含任何空格,那么类似下面的操作就可以了......在这里,我将所有
XDG_*
变量公开给一个docker容器:如果你真的想要 all 环境变量,你可能需要写一个更小的 Package 器程序来产生正确的带引号的输出(来处理包含空格的变量),并且排除跨多行的东西,比如
BASH_FUNC_*
变量,然后你可以用你的 Package 器来代替前面例子中的env | grep ...
。mznpcxlj2#
有两种方法可以使用-e标志:-e VAR=值和-e VAR;如果VAR已经被导出,那么第二种格式将使用导出的值,而不会使其公开可读,而且您不必担心对空格、引号等转义VALUE。
所以如果你真的想把所有导出的变量都传递给你的容器,试试这个:
gojuced73#
混合了@user3324033和@larsks的两个答案,下面是最适合我获取所有导出的环境变量和模拟奇点行为的答案:
rvpgvaaj4#
我发现@larsks的回答很有启发性,但我发现我需要在如何向容器中注入变量方面做得更外科一些。
如果您使用Makefile来构建和/或运行容器,您可以将gnu make的
foreach
关键字与env -i
结合起来,轻松地将环境变量注入到容器中:这将给予输出:
toe950275#
从安全性的Angular 来说,这可能是最不理想的答案,但如果其他方法都失败了,我会采取这样的方法:
env > env.txt; docker run -it [...] --env-file env.txt [...]; rm env.txt
假设你是以交互式会话的形式运行它,如果你是以后台服务的形式运行它,那么处理env.txt的清理就不同了。
您可以在命令链中设置文件的RW权限,也许是为了使其更安全,并将
;
切换为&&
,以便更好地执行命令我自己也尝试过其他的解决方案,但没有成功(我在Mac OS上,如果有区别的话,我会通过brew使用bash 4)。