使用docker运行一堆-e标志甚至是.env似乎很麻烦。
是否有任何简单的方法可以将所有主机env变量传递给docker容器
答案 0 :(得分:14)
我同意那些暗示你可能不想做你想做的事的评论者。但是:
如果(a)你对具有特定前缀的环境变量感兴趣,并且(b)你的变量不包含任何空格,那么这样的东西就可以了......在这里,我暴露了所有{{1变量到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
变量。然后,您将使用您的包装器代替前一个示例中的BASH_FUNC_*
。
答案 1 :(得分:7)
有两种方法可以使用-e标志:-e VAR = VALUE和-e VAR;如果VAR已经导出,那么第二种格式将使用导出的值而不会使其公开可读,此外,您不必担心将空白,引号等转义为VALUE。
因此,如果您确实要将所有导出的变量传递到容器,请尝试以下方法:
docker run ... $(env | cut -f1 -d= | sed 's/^/-e /') ...
答案 2 :(得分:3)
为user3324033和larsks混合了一些答案,这对我来说最有效,获取所有导出的环境变量并模仿奇点行为:
docker run [...] --env-file <( env| cut -f1 -d= ) [...]
答案 3 :(得分:0)
在安全性方面,这可能是最不理想的答案,但是,如果其他所有方法都失败了,我将采用对我有用的类似方法:
env > env.txt; docker run -it [...] --env-file env.txt [...]; rm env.txt
假定您将其作为交互式会话运行。如果您在后台将其作为服务运行,则处理env.txt的方式有所不同。
一个人可以在命令链中设置文件的RW权限,也许可以使其更安全。并将;
切换为&&
,以更好地依赖命令执行
我本人也没有运气尝试过其他解决方案(我在Mac OS上,如果有区别,可以通过brew使用bash 4)。
答案 4 :(得分:0)
我发现@larsks的答案很有启发性,但是发现我需要在将变量注入容器中时需要更多的手术。
如果您使用Makefiles来构建和/或运行容器,则可以将gnu make的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