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

Conda fails to build, when inside docker container

我正在尝试构建 docker 图像。这是完整的 docker 文件:

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:^..\(.*\).$::'` && \
    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 构建时 - 更具体地说是在第 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

Conda 太旧了

我用 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 云存储库兼容。

使用更新的 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)。

这可以类似地在 Docker 文件中使用类似

的内容来完成
RUN conda install -y python=2.7 conda=4.8 && \
    conda clean -qafy && \
    conda install -y conda-build && \
    conda clean -qafy

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