【问题标题】:Difference in environment when using 'docker build' or 'docker run'使用“docker build”或“docker run”时的环境差异
【发布时间】:2019-07-30 08:57:39
【问题描述】:

我开始学习 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 命令的行为之间的差异将(帮助我)解决我最初的问题。有谁知道造成这种差异的原因是什么?提前致谢。

【问题讨论】:

    标签: docker conda


    【解决方案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 有它们。这些图像非常不同,诊断构建阶段脚本一点也不容易。

    【讨论】:

    • 您好 astef,感谢您的回复。它帮助我更好地理解使用 conda build 时的事件顺序。但是,我不确定这是否是我的问题的原因。我认为ENV PATH /opt/conda/bin:$PATH 行设置了路径变量,conda activate base 应该在容器运行时激活环境。我刚刚对miniconda 进行了相同的尝试,并且对buildrun 都有效,但我不知道为什么。
    • ENV 是对的,但它只在上游构建期间运行。当您构建容器时,您基本上是在获取该上游构建的结果文件系统。我不能说为什么 miniconda 的文件系统完全不同,但我可以确认它们非常不同。
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 2023-03-03
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2021-08-23
    • 2015-05-23
    相关资源
    最近更新 更多