Я пытаюсь создать контейнер Docker с Anaconda и некоторыми другими вещами. После установки Anaconda мне нужно ее активировать. Когда я запускаю
CONDA_PATH=$HOME/anaconda3
eval "$($CONDA_PATH/bin/conda shell.bash hook)"
из моего контейнера, он работает. Но когда я включаю его в свой Dockerfile как
ENV CONDA_PATH $HOME/anaconda3
RUN eval "$($CONDA_PATH/bin/conda shell.bash hook)"
, это не так.
Я знаю, что eval выполняет аргументы как команду оболочки, но меня смущает перенос «$ ()» Кто-нибудь может объяснить, что он на самом деле делает?
Мой Dockerfile:
FROM ubuntu
MAINTAINER Kosh koshmariel@gmail.com
RUN apt-get update
RUN apt-get install htop
RUN apt-get install nano
WORKDIR /home
COPY Anaconda3-2020.02-Linux-x86_64.sh /home
ENV CONDA_PATH $HOME/anaconda3
RUN bash Anaconda3-2020.02-Linux-x86_64.sh -b -p $CONDA_PATH #silent Anaconda installation without activation
#RUN eval "$($CONDA_PATH/bin/conda shell.bash hook)"
RUN $CONDA_PATH/bin/conda shell.bash hook
#RUN conda init
#RUN conda install -c conda-forge -y tensorflow
CMD /bin/bash
eval "$ (shell-command)"
запустит shell-command
и подаст свой вывод в оболочку как команда для execute.
Хук в этом контексте представляет собой механизм для присоединения пользовательских действий к некоторому событию, обрабатываемому программным обеспечением.
, поэтому $ CONDA_PATH / bin / conda shell.bash hook
, вероятно, сгенерирует командную строку bash
, которая при выполнении соединит Анаконду с работающим процессом bash
и eval "$ ($ CONDA_PATH / bin / conda shell. bash hook) "
позаботится о выполнении этой команды. Попробуйте запустить $ CONDA_PATH / bin / conda shell.bash hook
непосредственно из приглашения оболочки, чтобы увидеть, что он производит, чтобы лучше понять, что происходит.
Поскольку bac0n ответил в комментарии :
Он оценит результат / вывод подкоманды.
Например,
eval "$ (echo echo test)"
выведетtest
.
(Воспроизводится здесь с измененным форматированием.)
Он выполняет сценарий bash для активации среды conda. Если вы хотите создать образ Docker с установленной Anaconda и активированной средой cond, в Dockerfile вам просто нужно добавить путь к anaconda в переменную среды PATH. (Он указывает каталоги, в которых находятся исполняемые программы*)
RUN /bin/bash ~/Anaconda3-2020.11-Linux-x86_64.sh -b -p
ENV PATH=$CONDA_DIR/bin:$PATH
$CONDA_DIR обычно имеет вид:
/home/$USER/anaconda3/bin
Таким образом, когда контейнер запустится, ваш conda env будет доступен