Docker中没有名为conda的模块

问题描述

我正在尝试创建一个安装了miniconda3的docker映像。我想从头开始,而不是直接使用base image offered in docker hub,而是创建自己的Dockerfile,并在其中放置Continuousumio / miniconda3映像的Dockerfile的命令,这些命令是:

FROM debian:latest

#  $ docker build . -t continuumio/miniconda3:latest -t continuumio/miniconda3:4.5.11
#  $ docker run --rm -it continuumio/miniconda3:latest /bin/bash
#  $ docker push continuumio/miniconda3:latest
#  $ docker push continuumio/miniconda3:4.5.11

ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV PATH /opt/conda/bin:$PATH

RUN apt-get update --fix-missing && \
    apt-get install -y wget bzip2 ca-certificates curl git && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /opt/conda && \
    rm ~/miniconda.sh && \
    /opt/conda/bin/conda clean -tipsy && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc

ENV tini_VERSION v0.16.1
ADD https://github.com/krallin/tini/releases/download/${tini_VERSION}/tini /usr/bin/tini
RUN chmod +x /usr/bin/tini

ENTRYPOINT [ "/usr/bin/tini","--" ]
CMD [ "/bin/bash" ]

构建和运行容器可以正常工作。作为参考,这是conda info在容器中的输出

(base) root@def48bd1ed5d:/# conda info

     active environment : base
    active env location : /opt/conda
            shell level : 1
       user config file : /root/.condarc
 populated config files : 
          conda version : 4.5.11
    conda-build version : not installed
         python version : 3.7.0.final.0
       base environment : /opt/conda  (writable)
           channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/free/linux-64
                          https://repo.anaconda.com/pkgs/free/noarch
                          https://repo.anaconda.com/pkgs/r/linux-64
                          https://repo.anaconda.com/pkgs/r/noarch
                          https://repo.anaconda.com/pkgs/pro/linux-64
                          https://repo.anaconda.com/pkgs/pro/noarch
          package cache : /opt/conda/pkgs
                          /root/.conda/pkgs
       envs directories : /opt/conda/envs
                          /root/.conda/envs
               platform : linux-64
             user-agent : conda/4.5.11 requests/2.19.1 cpython/3.7.0 Linux/4.4.0-187-generic debian/10 glibc/2.28
                UID:GID : 0:0
             netrc file : None
           offline mode : False

每当我尝试使用conda安装模块(例如conda install jupyter -y)时,都会出现问题。该过程开始,在安装过程中的某个时候出现此错误

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Traceback (most recent call last):
  File "/opt/conda/bin/conda",line 7,in <module>
    from conda.cli import main
ModuleNotFoundError: No module named 'conda'
(base) root@def48bd1ed5d:/# 

此后,似乎安装已被破坏。如果我尝试再次使用conda命令来调用示例conda info,则会收到相同的错误

(base) root@def48bd1ed5d:/# conda info
Traceback (most recent call last):
  File "/opt/conda/bin/conda",in <module>
    from conda.cli import main
ModuleNotFoundError: No module named 'conda'
(base) root@def48bd1ed5d:/# 

解决方法

在Dockerfile的安装行中指定的

miniconda3版本不是最新版本

您用来构建本地映像的Dockerfile将安装miniconda3-4.5.11而不是最新版本。您可以在这里找到它:

...
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /opt/conda &&
...

并以这种方式使用docker

$ docker build --tag miniconda3:test .
$ docker docker run -i -t miniconda3:test /bin/bash
$ docker history --no-trunc miniconda3:test | grep Miniconda3

/bin/sh -c wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && ...

好,现在让我们看看官方的continuumio/miniconda3

$ docker run -i -t continuumio/miniconda3 /bin/bash

然后:

$ docker history --no-trunc continuumio/miniconda3 | grep Miniconda3

/bin/sh -c wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && ...

您可以看到DockerHub上的continuumio/miniconda3映像安装了最新的miniconda3 4.8.2而非4.5.11版本。因此,从该Dockerfile构建的本地映像将产生带有miniconda3:4.5.11的容器。

python版本中的更改会中断conda

现在,让我们找出为什么conda失败的原因。首先构建并运行:

$ docker build --tag miniconda3:test .
$ docker docker run -i -t miniconda3:test /bin/bash

获取一些信息:

(base) root@61cafd17d954:/# conda info

     active environment : base
    active env location : /opt/conda
            shell level : 1
       user config file : /root/.condarc
 populated config files : 
          conda version : 4.5.11
    conda-build version : not installed
         python version : 3.7.0.final.0
       base environment : /opt/conda  (writable)
           channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/free/linux-64
                          https://repo.anaconda.com/pkgs/free/noarch
                          https://repo.anaconda.com/pkgs/r/linux-64
                          https://repo.anaconda.com/pkgs/r/noarch
                          https://repo.anaconda.com/pkgs/pro/linux-64
                          https://repo.anaconda.com/pkgs/pro/noarch
          package cache : /opt/conda/pkgs
                          /root/.conda/pkgs
       envs directories : /opt/conda/envs
                          /root/.conda/envs
               platform : linux-64
             user-agent : conda/4.5.11 requests/2.19.1 CPython/3.7.0 Linux/5.4.0-48-generic debian/10 glibc/2.28
                UID:GID : 0:0
             netrc file : None
           offline mode : False

好吧,我们有conda:4.5.11python:3.7.0

现在,我们将安装jupyter,例如:

(base) root@61cafd17d954:/# conda install jupyter

您可能会注意到,此安装将更新python

The following packages will be UPDATED:

...
    python:             3.7.0-hc3d631a_0        --> 3.8.5-h7579374_1       
...

如果继续,这将更新python并将破坏conda

...
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Traceback (most recent call last):
  File "/opt/conda/bin/conda",line 7,in <module>
    from conda.cli import main
ModuleNotFoundError: No module named 'conda'

这是一个众所周知的问题,您可以在How does using conda to install a package change my python version and remove conda?答案和官方的conda仓库:No module named conda.cli.main #2463中找到有关此问题的更多信息。

更新conda或对Dockerfile使用miniconda3:latest

有3种可能的解决方案:

  1. 通过替换以下行来编辑Dockerfile
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \

使用

RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
  1. 使用Dockerfile中最新的官方ContinuumIO,您可以找到here

  2. 在使用前更新容器内的conda

(base) root@61cafd17d954:/# conda update conda