我正在尝试使用 Anaconda 和其他一些东西创建一个 Docker 容器。安装 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 将参数作为 shell 命令执行,但我对包装“$()”感到困惑,有人能解释一下它实际上做了什么吗?
我的Dockerfile:
FROM ubuntu
MAINTAINER Kosh [email protected]
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
答案1
eval "$(shell-command)"
将运行shell-command
并喂养它输出作为命令传给 shell 来执行。
A钩在此上下文中,是一种将自定义操作附加到软件处理的某些事件的机制。
so$CONDA_PATH/bin/conda shell.bash hook
可能会生成一个bash
命令行,执行后,它会将 Anaconda 连接到正在运行的bash
进程,并eval "$($CONDA_PATH/bin/conda shell.bash hook)"
负责执行该命令。尝试$CONDA_PATH/bin/conda shell.bash hook
直接从 shell 提示符运行以查看它生成的内容,以便更好地了解正在发生的事情。这可能有助于您理解为什么它在 Docker 上下文中不起作用。
答案2
它执行一个 bash 脚本以激活 conda 环境。如果您想创建一个安装了 Anaconda 并激活了 conda 环境的 Docker 映像,则只需在 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 环境将可用