我正在尝试使用 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
eval "$(shell-command)"
将运行shell-command
并将其输出作为要执行的命令提供给 shell。在这种情况下,钩子是一种将自定义操作附加到软件处理的某些事件的机制。
所以
$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 上下文中工作。正如bac0n在评论中回答的那样:
(此处转载,格式已修改。)
它执行 bash 脚本以启动 conda 环境。如果你想创建一个安装了 Anaconda 并激活了 cond 环境的 Docker 镜像,你只需在 Dockerfile 中将 anaconda 路径添加到 PATH 环境变量中。(它指定可执行程序*所在的目录)
$CONDA_DIR 通常是:
因此,当容器启动时,您的 conda env 将可用