Dockerfile: создать переменную ENV, которую может видеть ПОЛЬЗОВАТЕЛЬ?

Есть ли способ установить переменную ENV для пользовательского ПОЛЬЗОВАТЕЛЯ в файле докеров?

Я пробую следующее:

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

Но мой пользователь "webapp" не видит переменную "FOO_VAR". ОДНАКО мой пользователь root МОЖЕТ.

Любая помощь будет оценена по достоинству.


person niknak    schedule 14.09.2015    source источник


Ответы (4)


Любой пользователь может увидеть переменные среды:

$ 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

Так что проблема не в этом. Возможно, ваш процесс создал новую среду, но я не могу быть уверен, поскольку вы не рассказали, как вы проверяете значение.

person Adrian Mouat    schedule 14.09.2015
comment
Ok. Я займусь этим. Спасибо, Адриан! - person niknak; 15.09.2015
comment
Выше ответ правильный. Когда я столкнулся с этой проблемой, это произошло потому, что я ожидал, что вары будут доступны после переключения пользователя с помощью «su». (Предупреждение о спойлере - так не работает). Если вам нужно такое поведение, добавьте запись в / etc / profile или /etc/profile.d в зависимости от ситуации. - person Slack Flag; 03.12.2018

Если вы переключаете контекст пользователя с помощью su в ENTRYPOINT, CMD или docker exec ... файла докеров, используя форму ниже, вы вводите новый процесс оболочки для данного имени пользователя, который не сохраняет исходные переменные среды, предоставленные целями ENV через dockerfile, docker-compose yaml или docker run -e ...

> su - username -c "run a process"

Чтобы избежать такого поведения, просто удалите черту - из вызова следующим образом:

> su username -c "run a process"

Назначенные вами переменные среды докера теперь сохранятся.

person Drone Brain    schedule 11.10.2019

Для справки в будущем это также верно внутри Dockerfile (а не только для любого пользователя контейнера во время выполнения):

$ 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-адреса ...)

person x10an14    schedule 14.11.2018

вот что у меня сработало после просмотра веб-страниц в поисках ответа:

в файле докеров

...
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, что означает, что переменные env пользователя root будут переданы my_user

вот моя ссылка: https://dev.to/pfreitag/passing-environment-variables-with-sudo-1ej6

person danfromisrael    schedule 22.03.2020