将所有主机环境变量传递给docker容器的最简单方法

时间:2016-10-24 23:33:33

标签: docker environment-variables

使用docker运行一堆-e标志甚至是.env似乎很麻烦。

是否有任何简单的方法可以将所有主机env变量传递给docker容器

5 个答案:

答案 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