密码学Python Docker多级构建
我有一个在docker容器中运行的Python项目,我正在尝试转换为多级docker构建过程。我的项目取决于软件包。我的Dockerfile包括:密码学Python Docker多级构建,python,docker,docker-multi-stage-build,Python,Docker,Docker Multi Stage Build,我有一个在docker容器中运行的Python项目,我正在尝试转换为多级docker构建过程。我的项目取决于软件包。我的Dockerfile包括: # Base FROM python:3.6 AS base RUN pip insta
# Base
FROM python:3.6 AS base
RUN pip install cryptography
# Production
FROM python:3.6-alpine
COPY --from=base /root/.cache /root/.cache
RUN pip install cryptography \
&& rm -rf /root/.cache
CMD python
我尝试用它来构建,例如:
docker build -t my-python-app .
这个过程适用于我测试过的许多其他Python需求,例如pycrypto
和psutil
,但是对于cryptography
,会抛出以下错误:
Step 5/6 : RUN pip install cryptography && rm -rf /root/.cache
---> Running in ebc15bd61d43
Collecting cryptography
Downloading cryptography-2.1.4.tar.gz (441kB)
Collecting idna>=2.1 (from cryptography)
Using cached idna-2.6-py2.py3-none-any.whl
Collecting asn1crypto>=0.21.0 (from cryptography)
Using cached asn1crypto-0.24.0-py2.py3-none-any.whl
Collecting six>=1.4.1 (from cryptography)
Using cached six-1.11.0-py2.py3-none-any.whl
Collecting cffi>=1.7 (from cryptography)
Downloading cffi-1.11.5.tar.gz (438kB)
Complete output from command python setup.py egg_info:
No working compiler found, or bogus compiler options passed to
the compiler from Python's standard "distutils" module. See
the error messages above. Likely, the problem is not related
to CFFI but generic to the setup.py of any Python package that
tries to compile C code. (Hints: on OS/X 10.8, for errors about
-mno-fused-madd see http://stackoverflow.com/questions/22313407/
Otherwise, see https://wiki.python.org/moin/CompLangPython or
the IRC channel #python on irc.freenode.net.)
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-uyh9_v63/cffi/
显然,我希望不必在我的产品映像上安装任何编译器。我是否需要跨
/root/.cache
以外的其他目录进行复制?Alpine没有manylinux控制盘,因此您需要自己编译它。下面是从安装文档中粘贴的。在同一命令中安装和删除生成依赖项,以仅将包保存到docker映像层
如果你在阿尔卑斯山上,或者只是想自己编译它
密码学需要一个编译器,用于Python的头文件(如果您不是
使用pypy)和OpenSSL和libffi库的头文件
在您的系统上可用
如果您使用的是Python2,请使用Pythondev替换python3 dev
$ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev
如果openssl-dev出现错误,则可能必须使用libressl-dev
我希望我的回答会有用
--user
选项在基本阶段通过pip安装加密。示例:运行pip安装--用户加密
。此选项意味着所有文件都将安装在
当前用户的主目录COPY--from=base/root/.local/root/.local
,因为加密技术安装在/root/.local中# Base
FROM python:3.6 AS base
RUN pip install --user cryptography
# Production
FROM python:3.6-alpine
COPY --from=base /root/.local /root/.local
RUN pip install cryptography \
&& rm -rf /root/.cache
CMD python
我想我在使用PyJWT和一些自定义加密算法时,在某种程度上使用了加密软件包,最后我记得,我不需要在任何地方编译它两次。此外,安装依赖项的理想方法是将所有应用程序库依赖项保存在一个需求文件中,将它从
Dockerfile
中复制到容器中,然后在同一Dockerfile中运行pip install-r
。多阶段docker构建(请参阅)的思想是,您可以使用完整映像(如python3.6
)来构建这些库,然后将工件复制到要运行的轻量级映像中。如果我能正确地复制工件,我所概述的方法不应该构建两次库。嗨@JonG,那么你明白了吗?不,对不起。在这种情况下,我倾向于使用slim而不是alpine来构建库。我以为我已经在BaseDocker阶段构建了库。我只是想复制整个结果。类似于他们在这里所做的:。。。那不可能吗?对不起,我来晚了。所以,问题是cffi试图在其setupscript中编译,以查看编译器是否存在。它实际上试图编译字符串,就像配置脚本一样。我不知道能否通过pip绕过这张支票。为了使一切都能在alpine上正常工作(python:3.6是基于debian的),我不会简单地复制包(即编译库和站点包),而是按照我的回答那样做。阿尔卑斯山脉;安装编译器&&安装python依赖项&&删除编译器。编译器将不会提交到image.hi@LoveTäting。您能否提供文档的链接。@StackEdd我已经添加了一个链接。安装工程。但是,当我运行应用程序时,它会显示:无法导入模块“lambda_函数”:libc.musl-x86_64.so.1:无法打开共享对象文件:没有这样的文件或目录。你知道这个吗?