Dockerfile:创建USER可以看到的ENV变量吗?

时间:2015-09-14 21:43:53

标签: docker dockerfile

有没有办法在docker文件中为自定义USER设置ENV变量?

我正在尝试以下方法:

FROM some_repo/my_base_image
ENV FOO_VAR bar_value
USER webapp
# ... continued (not important)

但我的" webapp"用户无法看到" FOO_VAR"变量。但是,我的root用户CAN。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:6)

任何用户都可以看到环境变量:

$ cat Dockerfile
FROM debian

ENV foo bar
RUN groupadd -r am && useradd -r -g am am
USER am
$ docker build -t test .
...
$ docker run test bash -c 'echo $foo'
bar

这不是问题所在。可能是您的流程分散了一个新环境,但我无法确定您是否还没有分享您检查价值的方式。

答案 1 :(得分:1)

如果您使用以下表单在dockerfile的suENTRYPOINTCMD中使用docker exec ...切换用户上下文,则为给定的用户名输入一个新的shell进程不保留ENV目标通过dockerfiledocker-compose yamldocker run -e ...

提供的原始环境变量

> su - username -c "run a process"

要避免这种情况,只需从呼叫中删除破折号-,如下所示:

> su username -c "run a process"

您分配的docker环境变量现在将持续存在。

答案 2 :(得分:0)

为将来参考,它在Dockerfile内也包含真实的 (而不是在运行时对任何容器的用户来说 just ):

$ cat Dockerfile 
FROM library/debian:9.5

ENV FOO="BAR"
RUN groupadd -r testuser && useradd -r -g testuser testuser 
RUN mkdir -p /home/testuser && chown -R testuser /home/testuser
RUN echo "${FOO}" && echo "meh.${FOO}.blah"

USER testuser
RUN echo "${FOO}" && echo "meh.${FOO}.blah" | tee -a ~/test.xt

还有docker build

$ docker build -t test .
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM library/debian:9.5
 ---> be2868bebaba
Step 2/7 : ENV FOO="BAR"
 ---> Running in f2cd5ecca056
Removing intermediate container f2cd5ecca056
 ---> f6f7b3f26cad
Step 3/7 : RUN groupadd -r testuser && useradd -r -g testuser testuser
 ---> Running in ab9c0726cc1e
Removing intermediate container ab9c0726cc1e
 ---> dc9f2a35fb09
Step 4/7 : RUN mkdir -p /home/testuser && chown -R testuser /home/testuser
 ---> Running in 108b1c03323d
Removing intermediate container 108b1c03323d
 ---> 4a63e70fc886
Step 5/7 : RUN echo "${FOO}" && echo "meh.${FOO}.blah"
 ---> Running in 9dcdd6b73e7d
BAR
meh.BAR.blah
Removing intermediate container 9dcdd6b73e7d
 ---> c33504cadc37
Step 6/7 : USER testuser
 ---> Running in 596b0588dde6
Removing intermediate container 596b0588dde6
 ---> 075e2c861021
Step 7/7 : RUN echo "${FOO}" && echo "meh.${FOO}.blah" | tee -a ~/test.xt
 ---> Running in fb2648d8c120
BAR
meh.BAR.blah
Removing intermediate container fb2648d8c120
 ---> c7c1c69e200f
Successfully built c7c1c69e200f
Successfully tagged test:latest

(但是由于某种原因,当我将变量用作curl URL目标的一部分时,在我自己的项目中它对我不起作用...

答案 3 :(得分:0)

在网上浏览并找到答案后,这对我有用:

在dockerfile中

...
RUN apt install sudo -y
ENV MY_VAR="some value"
...

现在位于容器内(或者在我的情况下,我编写的脚本将其运行在其内):

sudo -E -u my_user env # <- switch here to whatever command you want to execute

-E代表preserve-env,这意味着root用户的env变量将被传递给my_user

这是我的参考资料: https://dev.to/pfreitag/passing-environment-variables-with-sudo-1ej6