我正在尝试构建一个 dockerfile,但问题是当它尝试专门构建时cryptography 没有构建。
我的 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
我试图解决,但我不能。我是 docker 新手。请帮忙解决这个问题。
答案 0 :(得分:21)
您可以通过在 apk add 命令之前添加以下行来跳过 Rust 安装和其他相关依赖项:
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
答案 1 :(得分:16)
由于错误是...
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 ...
语句合并到单个 apk add
执行中。
答案 2 :(得分:3)
有些人可能会来这里(就像我一样)寻找 Python 的修复程序,不一定是 Alpine。
有几个选项可用,在 github issue 中提到。 (只选其中之一)
cryptography
版本降级到 3.4.x答案 3 :(得分:1)
我遇到了同样的问题,为了解决它,我尝试了以下方法:
@larsks 提供的答案。 RUN apk add cargo openssl-dev
有帮助。但这给我带来了巨大的图像大小(> 1GB)。最佳做法是始终以小图像尺寸为目标。这样,我们就不会暴露于任何外部漏洞。
答案由 Sabri Özgür ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
提供。这很好用!
根据@riptusk331 为之前的答案添加的评论,简单地忽略 Rust 构建可能只适用于现在,因为 Cryptography 3.5+ 将开始需要 Rust。
为了安全起见,我的解决方案是;
...
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
...
RUN pip install cryptography==3.4.6
...
通过这种方式,我设法在构建通过的同时将图像大小保持在相当低的值。