Dockerfile:创建用户可以看到的 ENV 变量?
Dockerfile: create ENV variable that a USER can see?
有没有办法在 docker 文件中为自定义用户设置 ENV 变量?
我正在尝试以下操作:
FROM some_repo/my_base_image
ENV FOO_VAR bar_value
USER webapp
# ... continued (not important)
但是我的 "webapp" 用户看不到 "FOO_VAR" 变量。但是,我的根用户可以。
如有任何帮助,我们将不胜感激。
任何用户都可以看到环境变量:
$ 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
所以这不是问题所在。可能是你的进程分叉了一个新环境,但我不能确定,因为你没有分享你如何检查值。
为了将来参考,这也适用于 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 目标的一部分时,它在我自己的项目中对我不起作用...)
如果您在 docker 文件的 ENTRYPOINT
、CMD
或 docker exec ...
中使用 su
切换用户上下文,请使用下面的表格输入新的 shell 给定用户名的进程不会保留 ENV
目标通过 dockerfile
、docker-compose yaml
或 docker run -e ...
提供的原始环境变量
> su - username -c "run a process"
要避免这种行为,只需像这样从调用中删除破折号 -
:
> su username -c "run a process"
您分配的 docker 环境变量现在将保留。
在网上浏览寻找答案后,以下是对我有用的方法:
在 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 用户的环境变量将被传递给 my_user
这是我的参考资料:
https://dev.to/pfreitag/passing-environment-variables-with-sudo-1ej6
有没有办法在 docker 文件中为自定义用户设置 ENV 变量?
我正在尝试以下操作:
FROM some_repo/my_base_image
ENV FOO_VAR bar_value
USER webapp
# ... continued (not important)
但是我的 "webapp" 用户看不到 "FOO_VAR" 变量。但是,我的根用户可以。
如有任何帮助,我们将不胜感激。
任何用户都可以看到环境变量:
$ 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
所以这不是问题所在。可能是你的进程分叉了一个新环境,但我不能确定,因为你没有分享你如何检查值。
为了将来参考,这也适用于 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 目标的一部分时,它在我自己的项目中对我不起作用...)
如果您在 docker 文件的 ENTRYPOINT
、CMD
或 docker exec ...
中使用 su
切换用户上下文,请使用下面的表格输入新的 shell 给定用户名的进程不会保留 ENV
目标通过 dockerfile
、docker-compose yaml
或 docker run -e ...
> su - username -c "run a process"
要避免这种行为,只需像这样从调用中删除破折号 -
:
> su username -c "run a process"
您分配的 docker 环境变量现在将保留。
在网上浏览寻找答案后,以下是对我有用的方法:
在 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 用户的环境变量将被传递给 my_user
这是我的参考资料: https://dev.to/pfreitag/passing-environment-variables-with-sudo-1ej6