Условная логика в Dockerfile с использованием --build-arg - PullRequest
0 голосов
/ 28 июня 2018

Скажите, у меня есть это:

ARG my_user="root"  # my_user => default is "root"
USER $my_user
ENV USER=$my_user

Пока все хорошо, но теперь мы здесь:

ENV HOME="/root"

есть ли способ сделать что-то вроде этого:

ENV HOME $my_user === "root"? "/root" : "/home/$my_user"

Очевидно, что это неправильный синтаксис.

Единственное решение, которое я могу придумать, это просто использовать два --build-args, что-то вроде этого:

docker build -t zoom \
    --build-arg my_user="foo"  \
    --build-arg my_home="/home/foo"  \
     .

1 Ответ

0 голосов
/ 28 июня 2018

К сожалению, вы не можете сделать это напрямую

https://forums.docker.com/t/how-do-i-send-runs-output-to-env-in-dockerfile/16106/3

Итак, у вас есть две альтернативы

Использовать сценарий оболочки при запуске

Вы можете использовать сценарий оболочки при запуске

CMD /start.sh

И в вашем start.sh вы можете иметь эту логику

if [ $X == "Y" ]; then
   export X=Y
else
   export X=Z
fi

Создание переменной среды профиля

FROM alpine

RUN echo "export NAME=TARUN" > /etc/profile.d/myenv.sh
SHELL ["/bin/sh", "-lc"]
CMD env

А потом ты когда запустишь

$ docker run test
HOSTNAME=d98d44fa1dc9
SHLVL=1
HOME=/root
PAGER=less
PS1=\h:\w\$
NAME=TARUN
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
CHARSET=UTF-8

Примечание: SHELL ["/bin/sh", "-lc"] здесь очень важно, иначе профиль не будет загружен

Примечание 2: вместо RUN echo "export NAME=TARUN" > /etc/profile.d/myenv.sh вы также можете сделать COPY myevn.sh /etc/profile.d/myenv.sh, и файл будет присутствовать в контексте вашей сборки

...