Dockerfile:如何获取 Anaconda

Dockerfile: How to source Anaconda

我正在尝试使用 AWS Batch 设置 Anaconda 环境

这是我的 Dockerfile 中的一个片段

#: Download Anaconda
COPY Anaconda3-2019.10-Linux-x86_64.sh /setup/
RUN bash Anaconda3-2019.10-Linux-x86_64.sh -b -p /home/ec2-user/anaconda3 
RUN echo 'export PATH=$PATH:/home/ec2-user/anaconda3/bin' >>~/.bashrc \
    && /bin/bash -c "source ~/.bashrc"
ENV PATH $PATH:/home/ec2-user/anaconda3/bin

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml

# Make RUN commands use the new environment:
SHELL ["conda", "run", "-n", "solver_env", "/bin/bash", "-c"]

当我访问我的容器并进行一些简单的测试时,我得到一个错误

conda: command not found

即使我找到了我的 bashrc 文件的路径。

此外,当我尝试访问我的 bashrc 文件时,我得到了

cat ~.bashrc: No such file or directory

cat: //.bashrc: No such file or directory

关于我可能要去哪里wrong/where检查的任何想法?

编辑:

我的 Dockerfile 中激活 venv 并启动脚本的最后一行是:

ENTRYPOINT ["conda", "run", "-n", "solver_env", "/bin/bash", "/usr/local/bin/fetch_and_run.sh"]

一旦我构建了图像并将其部署到 AWS ECR,我就开始了一个 Batch 作业,它基本上运行这个 shell 脚本:

#!/bin/bash
date
echo "Args: $@"
env
echo "script_path: "
echo "script_name: "
echo "path_prefix: "
echo "jobID: $AWS_BATCH_JOB_ID"
echo "jobQueue: $AWS_BATCH_JQ_NAME"
echo "computeEnvironment: $AWS_BATCH_CE_NAME"
   
mkdir /tmp/scripts/
aws s3 cp  /tmp/scripts/
python3 /tmp/scripts/${@:2}

与其修改 SHELL,不如将环境的 bin 目录添加到 PATH.

COPY Anaconda3-2019.10-Linux-x86_64.sh /setup/
RUN bash Anaconda3-2019.10-Linux-x86_64.sh -b -p /home/ec2-user/anaconda3 
RUN echo 'export PATH=$PATH:/home/ec2-user/anaconda3/bin' >>~/.bashrc \
    && /bin/bash -c "source ~/.bashrc"
ENV PATH=$PATH:/home/ec2-user/anaconda3/bin

# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml
# Activate the environment.
ENV PATH=/home/ec2-user/anaconda3/envs/solver_env/bin:$PATH

.bashrc 仅用于交互式 shell。尝试在 -c.

之前将 -i 添加到 ENTRYPOINT

您似乎忘记了命令中的斜线:

cat ~.bashrc: No such file or directory

应该是:

cat ~/.bashrc

此外,您在 Docker 文件中对 .bashrc 所做的一切都是毫无意义的。不仅如@Itamar 在他的回答中所述 .bashrc 仅在 interactive non-login shells 中执行,而且每个 RUN 命令都使用其自己的 Bash 进程,您甚至可以使用单独的进程来手动获取它,这实际上意味着您启动 Bash,获取 .bashrc,然后丢弃 Bash 的那个实例,丢弃所有更改。

我在 SuperUser 上回答了类似的问题,解决方案也适用于此。它实际上更简单,因为您想将 Docker 图像与 Docker 一起使用,而不是与 Singularity 一起使用,并且您希望 运行 作为根。

COPY Anaconda3-2019.10-Linux-x86_64.sh /setup/Anaconda3-2019.10-Linux-x86_64.sh
COPY environment.yml /setup/environment.yml
RUN bash /setup/Anaconda3-2019.10-Linux-x86_64.sh -b -p /home/ec2-user/anaconda3 && \
    rm /setup/Anaconda3-2019.10-Linux-x86_64.sh && \
    ln -s /home/ec2-user/anaconda3/bin/conda /usr/bin/conda && \
    conda env create -f /setup/environment.yml && \
    rm /setup/environment.yml

CMD ["conda", "run", "-n", "solver_env", "/bin/bash"]

如果您想在创建环境后 运行 一些更多的 conda 命令,您应该将它们附加到现有的 RUN 指令,如下所示:

COPY Anaconda3-2019.10-Linux-x86_64.sh /setup/Anaconda3-2019.10-Linux-x86_64.sh
COPY environment.yml /setup/environment.yml
RUN bash /setup/Anaconda3-2019.10-Linux-x86_64.sh -b -p /home/ec2-user/anaconda3 && \
    rm /setup/Anaconda3-2019.10-Linux-x86_64.sh && \
    ln -s /home/ec2-user/anaconda3/bin/conda /usr/bin/conda && \
    conda env create -f /setup/environment.yml && \
    rm /setup/environment.yml && \
    conda run -n solver_env python -V

CMD ["conda", "run", "-n", "solver_env", "/bin/bash"]