如何摆脱密码学构建错误?

Ala*_*nik 16 python-3.x docker

我正在尝试构建一个 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"]
Run Code Online (Sandbox Code Playgroud)

当我尝试构建我的 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

Run Code Online (Sandbox Code Playgroud)

我试图解决,但我不能。我是 docker 新手。请帮助解决这个问题。

Sab*_*gür 24

密码学 < 3.5:

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

ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
Run Code Online (Sandbox Code Playgroud)

密码 >= 3.5 : 谢谢@riptusk331

在此版本之后将需要rust 。安装特定版本 <3.5 或遵循加密安装说明。在附加的链接中指出,它们在文档中得到了非常积极的解释。

  • @riptusk331 大多数人需要加密作为依赖库,这意味着不直接使用该库。我不知道 Rust 能为密码学带来什么。忽略它解决了我的问题,所以我继续这样做。密码学开发人员可能有他们的理由要求 Rust 依赖。我不明白的是为什么我必须在自己安装依赖项时手动确保安装子依赖项。如果该过程是自动化的,我就不会花时间禁用它。 (3认同)
  • 在花了一整天的时间研究一系列全新的奇怪问题后,这解决了我的问题。多谢!!! (2认同)
  • 虽然这可能会解决一些人眼前的问题,但这是一个糟糕的答案,会让人们为未来的问题做好准备。如果您建议完全绕过 Rust 构建,您能解释一下原因吗?OP 使用 3.7-alpine 镜像,它支持 Rust(它是 Alpine v3.13)。正如 @larsks 在他们的答案中建议的那样,只需安装编译器和包管理器(“rust”和“cargo”)即可正常工作。密码学 3.5+ 将开始 [要求](https://github.com/pyca/cryptography/issues/5771#issuecomment-775016788) Rust...所以你只是在这里把问题押注。 (2认同)

lar*_*sks 23

由于错误是...

error: Can not find Rust compiler
Run Code Online (Sandbox Code Playgroud)

...解决方案是安装 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
Run Code Online (Sandbox Code Playgroud)

请注意,上面的apk add ...命令行与您所拥有的基本相同;我只是将多个apk add ... 语句简化为单个apk add执行。

  • 哦,还看到这个令人兴奋的问题:https://github.com/pyca/cryptography/issues/5771 (3认同)
  • 谢谢。现在问题已经解决了。顺便说一句,你能告诉我货物和铁锈有什么作用吗? (2认同)

Sum*_*ran 19

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


Pet*_*eer 5

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

有几个选项可用,在github 问题 中提到。(只选其中之一)

  1. 您可以安装锈,正如提到的另一个答案
  2. 您可以将cryptography版本降级到 3.4.x
  3. 您可以升级到 pip 版本 19.1.1 或更高版本,它会安装预编译包

  • 我正在使用 pip 21.0.1,但无法构建。我什至不想构建它......我只是安装wheel,但它具有加密作为依赖项。 (3认同)

Ash*_*era 5

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

\n
    \n
  1. 答案由@larsks 提供。RUN apk add cargo openssl-dev帮助了。但这给我带来了巨大的图像尺寸(>1GB)。最佳实践是始终以小图像尺寸为目标。这样,我们就不会暴露于任何外部漏洞。

    \n
  2. \n
  3. 答案由 Sabri \xc3\x96zg\xc3\xbcr 提供,ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1。这太棒了!

    \n
  4. \n
  5. 根据 @riptusk331 对之前答案添加的评论,简单地忽略 Rust 构建可能只能暂时起作用,因为 Cryptography 3.5+ 将开始需要 Rust。

    \n
  6. \n
\n

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

\n
...\nENV CRYPTOGRAPHY_DONT_BUILD_RUST=1\n...\nRUN pip install cryptography==3.4.6 \n...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n