我正试图构建一个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问题中提到了几个选项。(只选择其中一个)
- 正如另一个答案所提到的,你可以安装铁锈
- 您可以将
cryptography
版本降级为3.4.x - 您可以升级到pip19.1.1或更高版本,该版本安装预编译包
我遇到了同样的问题,为了解决它,我尝试了以下方法:
-
答案由@larsks提供。
RUN apk add cargo openssl-dev
起了作用。但这对我来说导致了巨大的图像大小(>1GB)。最佳实践是始终以最小的图像大小为目标。这样,我们就不会暴露在任何外部漏洞中。 -
答案由SabriÖzgür提供,
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
。效果很好! -
根据@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"]