在 docker 容器内时,Conda 无法构建

Posted

技术标签:

【中文标题】在 docker 容器内时,Conda 无法构建【英文标题】:Conda fails to build, when inside docker container 【发布时间】:2021-05-25 21:19:11 【问题描述】:

我正在尝试构建一个 docker 映像。这是完整的 dockerfile:

FROM ubuntu

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

ENV TZ=Europe/Athens
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update --fix-missing && apt-get install -y wget bzip2 ca-certificates \
    libglib2.0-0 libxext6 libsm6 libxrender1 \
    git mercurial subversion

RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /opt/conda && \
    rm ~/miniconda.sh && \
    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

RUN apt-get install -y curl grep sed dpkg && \
    TINI_VERSION=`curl https://github.com/krallin/tini/releases/latest | grep -o "/v.*\"" | sed 's:^..\(.*\).$:\1:'` && \
    curl -L "https://github.com/krallin/tini/releases/download/v$TINI_VERSION/tini_$TINI_VERSION.deb" > tini.deb && \
    dpkg -i tini.deb && \
    rm tini.deb && \
    apt-get clean

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

#SECOND PART
RUN apt install -y libgl1-mesa-glx
RUN conda install conda-build
RUN apt-get install -y git
WORKDIR /
RUN git clone https://github.com/cadquery/cadquery.git
WORKDIR /cadquery
RUN conda env create -n cq -f environment.yml
RUN echo "source activate cq" > ~/.bashrc
ENV PATH /opt/conda/envs/cq/bin:$PATH
WORKDIR /testing

但是,当需要进行 conda 构建时 - 更具体地说是在 STEP 12 上,这里的这一行:

RUN conda install conda-build

我得到错误。

好像安装包正常,然后就失败了:

Proceed ([y]/n)? 
ruamel_yaml-0.15.100 | 268 KB    | ########## | 100% 
readline-8.1         | 464 KB    | ########## | 100% 
bzip2-1.0.8          | 105 KB    | ########## | 100% 
tzdata-2020f         | 123 KB    | ########## | 100% 
xz-5.2.5             | 438 KB    | ########## | 100% 
tk-8.6.10            | 3.2 MB    | ########## | 100% 
conda-build-3.21.4   | 585 KB    | ########## | 100% 
cffi-1.14.5          | 227 KB    | ########## | 100% 
ld_impl_linux-64-2.3 | 645 KB    | ########## | 100% 
urllib3-1.26.4       | 99 KB     | ########## | 100% 
pyyaml-5.4.1         | 180 KB    | ########## | 100% 
pip-21.1.1           | 2.0 MB    | ########## | 100% 
lz4-c-1.9.3          | 216 KB    | ########## | 100% 
beautifulsoup4-4.9.3 | 86 KB     | ########## | 100% 
python-3.9.5         | 22.7 MB   | ########## | 100% 
pkginfo-1.7.0        | 42 KB     | ########## | 100% 
tqdm-4.59.0          | 90 KB     | ########## | 100% 
setuptools-52.0.0    | 880 KB    | ########## | 100% 
python-libarchive-c- | 50 KB     | ########## | 100% 
cryptography-3.4.7   | 1.0 MB    | ########## | 100% 
icu-58.2             | 22.7 MB   | ########## | 100% 
pysocks-1.7.1        | 31 KB     | ########## | 100% 
libxml2-2.9.10       | 1.3 MB    | ########## | 100% 
certifi-2020.12.5    | 143 KB    | ########## | 100% 
openssl-1.1.1k       | 3.8 MB    | ########## | 100% 
libgcc-ng-9.1.0      | 8.1 MB    | ########## | 100% 
patchelf-0.12        | 92 KB     | ########## | 100% 
glob2-0.7            | 12 KB     | ########## | 100% 
idna-2.10            | 52 KB     | ########## | 100% 
liblief-0.10.1       | 2.0 MB    | ########## | 100% 
pycparser-2.20       | 94 KB     | ########## | 100% 
chardet-4.0.0        | 198 KB    | ########## | 100% 
py-lief-0.10.1       | 1.3 MB    | ########## | 100% 
markupsafe-2.0.1     | 22 KB     | ########## | 100% 
zlib-1.2.11          | 120 KB    | ########## | 100% 
wheel-0.36.2         | 31 KB     | ########## | 100% 
conda-4.10.1         | 3.1 MB    | ########## | 100% 
libffi-3.3           | 54 KB     | ########## | 100% 
yaml-0.2.5           | 87 KB     | ########## | 100% 
libarchive-3.4.2     | 1.6 MB    | ########## | 100% 
ca-certificates-2021 | 120 KB    | ########## | 100% 
conda-package-handli | 967 KB    | ########## | 100% 
filelock-3.0.12      | 10 KB     | ########## | 100% 
requests-2.25.1      | 51 KB     | ########## | 100% 
ncurses-6.2          | 1.1 MB    | ########## | 100% 
pytz-2021.1          | 244 KB    | ########## | 100% 
pycosat-0.6.3        | 108 KB    | ########## | 100% 
psutil-5.8.0         | 342 KB    | ########## | 100% 
sqlite-3.35.4        | 1.4 MB    | ########## | 100% 
zstd-1.4.9           | 809 KB    | ########## | 100% 
jinja2-3.0.0         | 99 KB     | ########## | 100% 
brotlipy-0.7.0       | 349 KB    | ########## | 100% 
ripgrep-12.1.1       | 1.5 MB    | ########## | 100% 
_libgcc_mutex-0.1    | 3 KB      | ########## | 100% 
six-1.15.0           | 13 KB     | ########## | 100% 
soupsieve-2.2.1      | 30 KB     | ########## | 100% 
pyopenssl-20.0.1     | 48 KB     | ########## | 100% 

Downloading and Extracting Packages

UnicodeDecodeError('ascii', '/info/test/tests/data/\xed\x94\x84\xeb\xa1\x9c\xea\xb7\xb8\xeb\x9e\xa8.zip.json', 22, 23, 'ordinal not in range(128)')


The command '/bin/sh -c conda install conda-build' returned a non-zero code: 1

【问题讨论】:

如果重点是 Dockerize cadquery,为什么不使用现有图像? github.com/RubenRubens/cq-containers#available-containers 是的,这就是重点。我已成功使用该图像。但我也使用了其他应用程序 - 彼此相关,使用 docker 但有FROM ubuntu。现在我想将所有东西链接在一起并拥有一个泊坞窗图像。用于 dockerize cad 查询的 dockerfile 使用 FROM continuumio/miniconda3。然后使用FROM debian。所以我所做的是我修改了 continuumio/miniconda3 图像,使用FROM ubuntu。该过程的第一部分(修改 continuumio/miniconda3)有效。这是第二部分 - 下载 cadquery,失败了。 【参考方案1】:

康达太老了

我用continuumio/miniconda2:4.5.11 Docker 镜像复制了这个错误:

$ docker run --rm -it continuumio/miniconda2:4.5.11 bash
(base) root@a285050719ad:/# conda install -y conda-build

# ... similar output as OP ...

UnicodeDecodeError('ascii', '/info/test/tests/data/\xed\x94\x84\xeb\xa1\x9c\xea\xb7\xb8\xeb\x9e\xa8.zip.json', 22, 23, 'ordinal not in range(128)')

此外,尝试升级 conda 软件包失败并提供一些额外建议:

(base) root@a285050719ad:/# conda update conda
Solving environment: done

EncodingError: A unicode encoding or decoding error has occurred.
Python 2 is the interpreter under which conda is running in your base environment.
Replacing your base environment with one having Python 3 may help resolve this issue.
If you still have a need for Python 2 environments, consider using 'conda create'
and 'conda activate'.  For example:

    $ conda create -n py2 python=2
    $ conda activate py2

Error details: UnicodeDecodeError('ascii', '/info/test/tests/data/\xed\x94\x84\xeb\xa1\x9c\xea\xb7\xb8\xeb\x9e\xa8.zip.json', 22, 23, 'ordinal not in range(128)')

也就是说,您真的不应该使用这些旧的 Miniconda2 映像,因为 conda 不再与 Anaconda Cloud 存储库兼容。

使用较新的 Miniconda 安装程序

一个干净的解决方案是安装更新的 Miniconda(或 Miniforge 或 Mambaforge)。最新的都在 base 中有 Python 3。如果出于某种原因必须在 base 中安装 Python 2,这意味着您不能拥有最新的 conda 或最新的 conda-build,那么似乎是 Miniconda up to 4.8.3 supported Python 2。

如果可能,使用最新版本,就像在 Python 3 中一样。如果需要,可以随时创建 Python 2 环境 - 最好不要在 base 中.建议的解决方案:

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

此外,请考虑是否可以更简单地从预安装了 Conda 的现有 Docker 映像开始。

就地更新 Conda(不推荐)

脏版本仍会使用相同的 4.5.11 安装程序,但会立即升级。在 Docker 映像中,我可以将其升级到 4.8 并保留 Python 2.7,然后 conda-build 将安装在 3.18.11(截至 2021 年 5 月的当前为 3.21.4)。

这可以类似地在 Dockerfile 中使用类似的东西来完成

RUN conda install -y python=2.7 conda=4.8 && \
    conda clean -qafy && \
    conda install -y conda-build && \
    conda clean -qafy

注意:我需要第一次清理才能安装 conda-build

【讨论】:

非常感谢!!!你提到了continuumio/miniconda2:4.5.11。这很有趣,因为我的 dockerfile 的第一部分是修改后的 continuumio/miniconda3 图像。我只是使用 ubuntu 而不是 debian 并为时区添加了一些东西。所以图像的第一部分通过了。第二部分(我用注释更新了 dockerfile - 看看第二部分从哪里开始)是用于下载 cadquery 的 dockerfile,它使用了FROM continuumio/miniconda3。我只是将两个 dockerfile 链接在一起。但是由于 cadquery 有效,我不知道为什么我的连体版本没有。 你的回答让我有点困惑。我的 dockerfile 中有什么问题的行?这个问题可以解决吗? 啊哈,所以我用的是 miniconda2。所以我应该用你提到的那一行替换RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \ /bin/bash ~/miniconda.sh -b -p /opt/conda && \ rm ~/miniconda.sh && \ 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这一行?这是正确的吗? @user1584421 不要替换整个东西 - 只需将 Miniconda2-4.5.11-Linux-x86_64.sh 更改为 Miniconda3-latest-Linux-x86_64.sh

以上是关于在 docker 容器内时,Conda 无法构建的主要内容,如果未能解决你的问题,请参考以下文章

Docker和Conda:在Mac和Ubuntu上构建相同容器时的差异

docker-compose 有两个容器:web 无法连接到 db

docker容器时间与宿主机时间不一致问题总结

构建 docker 容器时 gcsfuse 无法挂载

使用Jenkins Pipeline插件和Docker打造容器化构建环境

构建自己的Docker镜像