9

我对 Docker 和部署周期有点陌生。

我有 Django 应用程序,我们想使用 uWSGI 将其部署到 docker 容器。实际上部署工作了几个星期,但现在它完全报告错误......

与密码学包一起出现的错误接缝:

build/temp.linux-x86_64-3.6/_openssl.c:52862:10: warning: conversion to 'long unsigned int' from 'long int' may change the sign of the result [-Wsign-conversion]
build/temp.linux-x86_64-3.6/_openssl.c: In function '_cffi_f_SSL_set_options':
build/temp.linux-x86_64-3.6/_openssl.c:52895:14: warning: conversion to 'long int' from 'long unsigned int' may change the sign of the result [-Wsign-conversion]
   { result = SSL_set_options(x0, x1); }
              ^~~~~~~~~~~~~~~
build/temp.linux-x86_64-3.6/_openssl.c:52895:14: warning: conversion to 'long unsigned int' from 'long int' may change the sign of the result [-Wsign-conversion]
error: command 'gcc' failed with exit status 1
----------------------------------------
Command "/usr/local/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-dg_tg9pa/cryptography/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-my98rwq4/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-dg_tg9pa/cryptography/ 
The command '/bin/sh -c pip install --no-cache-dir -r requirements.txt' returned a non-zero code: 1
ERROR: Job failed: exit code 1

我们的 docker 文件看起来像

FROM python:3-alpine

ENV PYTHONUNBUFFERED 1

WORKDIR /usr/src/app

RUN apk add --no-cache gcc mailcap python3-dev build-base linux-headers pcre-dev postgresql-dev libffi-dev libressl-dev

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

正如我提到的,docker 文件和require.txt 在成功构建和失败构建之间没有变化。(对我来说最奇怪的是什么……)

我唯一能想到的就是那个命令

FROM python:3-alpine

正在服用不同版本的alpine...

这可能吗?有什么问题?如何解决?

4

3 回答 3

18

对于大多数提供 C/C++ 扩展(用 C/C++ 编写的代码,编译为共享对象并通过外部函数库在 Python 中加载)的大多数 Python 包来说,Alpine 是一个令人头疼的发行版。原因是 PEP 513,Linux 发行版 manylinux1 之间的可移植性定义基于 glibc/glibcxx。由于 Alpine 使用 musl libc,因此在 Alpine 上无法安装 manylinux1 兼容的轮子。因此,当您发出 pip install cryptography 时,带有已编译扩展的轮子会被过滤,并且 pip 会尝试使用源代码中的所有 C 扩展构建包。

使用系统包管理器安装

这是首选方式,@GracefulRestart 在评论中提到;如果您不需要软件包的前沿版本,请使用它。使用 apk 安装它:

$ apk add py-cryptography

使用 pip 安装

如果您需要最前沿的版本,您可以尝试通过使用 pip 安装从源代码构建它。

准备构建环境

您将需要编译器和带有头文件的库:musl、OpenSSL、libffi 和 Python 本身:

$ apk add gcc musl-dev libffi-dev openssl-dev python3-dev


建造

$ pip install pkgname

默认隐藏构建日志。要查看完整的构建日志,请添加 -vvv 以增加详细程度。(可选)此外,您可以通过添加明确禁止安装 manylinux1 轮子 -

-no-binary=pkgname

因此将强制执行从源代码构建。

$ pip install cryptography -vvv --no-binary=cryptography
于 2019-09-20T12:06:41.877 回答
8

我的修复是降级到 alpine3.6(我在使用 alpine3.8 时遇到了这个问题)。

FROM python:3.6.6-alpine3.6

RUN apk update && apk add libressl-dev postgresql-dev libffi-dev gcc musl-dev python3-dev 
于 2018-07-24T09:04:38.897 回答
2

找到了解决办法。指定旧版本libressl-dev已修复了我的 DockerHub 构建。

apk add --no-cache libressl-dev=2.6.4-r2

2.7.3-rx当前是最新版本libressl-dev并且是有问题的版本。尝试在您的 Dockerfile 中使用上面提到的版本,看看它是否适合您。

于 2018-06-01T21:41:34.770 回答