我开始学习Docker,并且遇到了一些我无法理解的行为。
我想在Docker容器中使用conda
,但是在使用docker build .
时遇到错误/bin/sh: 1: conda: not found
。经过调查,我认为我找到了问题。环境变量conda
中未列出PATH
。我简化的Dockerfile
:
FROM continuumio/anaconda3
RUN env
RUN conda info
结果环境变量未显示对conda
的任何引用。但是,当我使用docker run -it continuumio/anaconda3
,然后在此处运行命令env
时,我的PATH
确实包含对conda
的引用。
我认为解决或理解docker run
和docker build
命令的行为差异将(帮助我)解决我的最初问题。有谁知道造成差异的原因?预先感谢。
答案 0 :(得分:1)
有一行:
echo "conda activate base" >> ~/.bashrc
我相信它正在注册环境变量。
运行容器conda activate base
时,命令将作为.bashrc
脚本的一部分执行。原因如下:https://unix.stackexchange.com/questions/129143/what-is-the-purpose-of-bashrc-and-how-does-it-work
在构建阶段,唯一发生的事情是echo
命令写入.bashrc
文件。
但是您必须不将构建阶段理解为计算机上的构建。基本映像是由其他人构建一次的(“上游构建”),而您仅获取一个结果文件系统以在其上运行构建(“下游构建”)。
这就是为什么您不能依赖基本Dockerfile中的ENV
声明。
有一种技术可以通过ONBUILD directive来影响上游构建,但是对于您的图像却不是这样。
很难回答为什么anaconda3生成的文件系统不包含定义的某些环境变量,以及为什么miniconda拥有它们。这些图像有很大的不同,而且诊断构建阶段脚本根本不容易。