如何摆脱密码学构建错误



我正试图构建一个dockerfile,但问题是当它试图专门构建加密时,却没有构建。

我的Dockerfile

FROM python:3.7-alpine
ENV PYTHONUNBUFFERED 1
RUN apk update 
# psycopg2 dependencies
&& apk add --virtual build-deps gcc python3-dev musl-dev
&& apk add postgresql-dev 
&& apk add build-base 
# Pillow dependencies
&& apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev 
# CFFI dependencies
&& apk add libffi-dev py-cffi 
# Translations dependencies
&& apk add gettext 
# https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell
&& apk add postgresql-client 
# cairo
&& apk add cairo cairo-dev pango-dev gdk-pixbuf-dev poppler-utils
# fonts for weasyprint
RUN mkdir ~/.fonts
COPY ./fonts/* /root/.fonts/
# secret key (should be in docker-secrets, or we need to run minikube locally
RUN mkdir /etc/secrets
COPY secret.readme proxy_rsa_key* /etc/secrets/
# Requirements are installed here to ensure they will be cached.
COPY ./requirements /requirements
RUN pip install -r /requirements/local.txt
COPY ./compose/local/django/entrypoint /entrypoint
RUN sed -i 's/r//' /entrypoint
RUN chmod +x /entrypoint
COPY ./compose/local/django/start /start
RUN sed -i 's/r//' /start
RUN chmod +x /start
COPY ./compose/local/django/celery/worker/start /start-celeryworker
RUN sed -i 's/r//' /start-celeryworker
RUN chmod +x /start-celeryworker
COPY ./compose/local/django/celery/beat/start /start-celerybeat
RUN sed -i 's/r//' /start-celerybeat
RUN chmod +x /start-celerybeat
COPY ./compose/local/django/celery/flower/start /start-flower
RUN sed -i 's/r//' /start-flower
RUN chmod +x /start-flower
WORKDIR /app
ENTRYPOINT ["/entrypoint"]

当我尝试构建我的dockerfile时,它显示:

Building wheel for cryptography (PEP 517): finished with status 'error'
ERROR: Command errored out with exit status 1:

error: Can not find Rust compiler
----------------------------------------
ERROR: Failed building wheel for cryptography

我试着解决,但我解决不了。我是码头工人的新手。请帮助解决这个问题。

密码学<3.5:

您可以在apk添加命令之前添加以下行,跳过rust安装和其他相关依赖项:

ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1

密码学>=3.5感谢@criptusk331

此版本之后,将需要进行防锈处理。安装特定版本<3.5或遵循加密安装说明。在所附的链接中,他们在文档中进行了非常积极的解释。

由于错误是…

error: Can not find Rust compiler

解决方案是安装rust编译器。您还需要cargo,Rust包管理器,它看起来像您的Dockerfile缺少openssl-dev

以下构建对我来说是成功的:

FROM python:3.7-alpine
ENV PYTHONUNBUFFERED 1
RUN apk add --update 
build-base 
cairo 
cairo-dev 
cargo 
freetype-dev 
gcc 
gdk-pixbuf-dev 
gettext 
jpeg-dev 
lcms2-dev 
libffi-dev 
musl-dev 
openjpeg-dev 
openssl-dev 
pango-dev 
poppler-utils 
postgresql-client 
postgresql-dev 
py-cffi 
python3-dev 
rust 
tcl-dev 
tiff-dev 
tk-dev 
zlib-dev
RUN pip install cryptography

注意,上面的apk add ...命令行与你所拥有的;我刚刚简化了多重apk add ...语句转换为单个CCD_ 6执行。

pip install -U pip就是我所要做的

有些人可能会来这里(就像我一样)寻找只针对Python的修复程序,而不一定是Alpine。

github问题中提到了几个选项。(只选择其中一个)

  1. 正如另一个答案所提到的,你可以安装铁锈
  2. 您可以将cryptography版本降级为3.4.x
  3. 您可以升级到pip19.1.1或更高版本,该版本安装预编译包

我遇到了同样的问题,为了解决它,我尝试了以下方法:

  1. 答案由@larsks提供。RUN apk add cargo openssl-dev起了作用。但这对我来说导致了巨大的图像大小(>1GB)。最佳实践是始终以最小的图像大小为目标。这样,我们就不会暴露在任何外部漏洞中。

  2. 答案由SabriÖzgür提供,ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1。效果很好!

  3. 根据@criptusk331为之前的答案添加的评论,简单地忽略Rust构建可能只适用于目前,因为Cryptography 3.5+将开始需要Rust。

为了安全起见,我的解决方案是;

...
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
...
RUN pip install cryptography==3.4.6 
...

通过这种方式,我设法将图像大小保持在一个相当低的值,同时使构建通过

通过在我的.env中添加编辑pyvenv.cfg

CRYPTOGRAPHY_DONT_BUILD_RUST=1

然后做pip install cryptography,解决了我的问题。

对我来说(主机是Apple Silicon ARM Mac,运行在Alpine Docker中),我必须做:

# upgrade pip
pip install --upgrade pip
# install rust toolchain
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable -y
PATH="/root/.cargo/bin:${PATH}"
# build from source
pip install cryptography --no-cache-dir --only-binary=:all: --force-reinstall --upgrade

对我有效的解决方案是按照文档建议升级pip,修复它的第一步是更新pip

如果您在安装加密技术时遇到问题,第一个疑难解答步骤是升级pip,然后尝试再次安装。对于大多数用户来说,这将采取pip-install-U-pip的形式,但在Windows上,您应该执行python-m pip-install-U-pip。如果您在升级并再次尝试pip-install加密后仍然看到错误,请参阅安装文档。

pip的新版本预装了密码学的轮子,所以你不必处理构建它的问题

我正在使用python:3.9.5-alpine,要升级pip,只需将其添加到您的Dockerfile:

RUN pip install --upgrade pip

只需安装rust编译器并将其放入环境中。

以下是Dokerfile的一个简单示例:

FROM python:3.9
# Install Rust
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
COPY . /app
WORKDIR /app
# Install the requirement that may need rust
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

最新更新