使用'docker build'或'docker run'时环境的差异

时间:2019-07-30 08:57:39

标签: docker conda

我开始学习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 rundocker build命令的行为差异将(帮助我)解决我的最初问题。有谁知道造成差异的原因?预先感谢。

1 个答案:

答案 0 :(得分:1)

Dockerfile

有一行:

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拥有它们。这些图像有很大的不同,而且诊断构建阶段脚本根本不容易。