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

1mrurvl1  于 2023-01-12  发布在  Docker
关注(0)|答案(5)|浏览(170)

使用带有一堆-e标志甚至是.env的docker运行似乎很麻烦。
有没有简单的方法可以将所有主机env变量传递给docker容器

js81xvg6

js81xvg61#

我同意那些评论者的观点,他们认为你可能并不真正想做你认为你想做的事情。
如果(a)您对带有特定前缀的环境变量感兴趣,并且(b)您的变量不包含任何空格,那么类似下面的操作就可以了......在这里,我将所有XDG_*变量公开给一个docker容器:

$ 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 ...

mznpcxlj

mznpcxlj2#

有两种方法可以使用-e标志:-e VAR=值和-e VAR;如果VAR已经被导出,那么第二种格式将使用导出的值,而不会使其公开可读,而且您不必担心对空格、引号等转义VALUE。
所以如果你真的想把所有导出的变量都传递给你的容器,试试这个:

docker run ... $(env | cut -f1 -d= | sed 's/^/-e /') ...
gojuced7

gojuced73#

混合了@user3324033和@larsks的两个答案,下面是最适合我获取所有导出的环境变量和模拟奇点行为的答案:

docker run [...] --env-file <( env| cut -f1 -d= ) [...]
rvpgvaaj

rvpgvaaj4#

我发现@larsks的回答很有启发性,但我发现我需要在如何向容器中注入变量方面做得更外科一些。
如果您使用Makefile来构建和/或运行容器,您可以将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
toe95027

toe950275#

从安全性的Angular 来说,这可能是最不理想的答案,但如果其他方法都失败了,我会采取这样的方法:
env > env.txt; docker run -it [...] --env-file env.txt [...]; rm env.txt
假设你是以交互式会话的形式运行它,如果你是以后台服务的形式运行它,那么处理env.txt的清理就不同了。
您可以在命令链中设置文件的RW权限,也许是为了使其更安全,并将;切换为&&,以便更好地执行命令
我自己也尝试过其他的解决方案,但没有成功(我在Mac OS上,如果有区别的话,我会通过brew使用bash 4)。

相关问题