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"]
我正在尝试使用 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"]