深入研究Python的官方Docker图像

2020-08-20 21:45:20

Docker的官方Python映像相当流行,事实上我推荐它的一个变体作为基础映像,但很多人不太了解它的作用,这可能会导致混乱和崩溃。

因此,在这篇文章中,我将详细介绍它是如何构建的,为什么有用,如何正确使用它,以及它的局限性。特别是,我将通读Python:3.8-Lem-Buster变体,截止到2020年8月19日,并在进行过程中对其进行解释。

也就是说,基本映像是Debian GNU/Linux 10,这是Debian发行版的当前稳定发行版,也称为Buster,因为Debian以“玩具总动员”中的角色命名它们的所有发行版。如果您想知道,Buster是Andy的宠物狗。

因此,首先,这是一个Linux发行版,它保证了随着时间的推移的稳定性,同时提供了错误修复。超薄的变体安装的软件包较少,因此没有编译器。

基本上,Python映像的工作方式是将Python安装到/usr/local,因此这确保了它安装的可执行文件是默认使用的可执行文件。

目前,在http://bugs.python.org/issue19846系统上设置##34;lang=C&34;从根本上破坏了Python3*,这是不对的。环境语言C.UTF-8。

据我所知,即使没有UTF-8,现代Python3也会默认使用UTF-8,所以我不确定现在有没有必要这么做。

以及一个带有GPG密钥的环境变量,用于在下载Python源代码时对其进行验证。

运行apt-get update&;&;apt-get install-y--no-install-Recommendations\ca-Certificate\netbase\&;&;rm-rf/var/lib/apt/list/*。

第一个是ca-Certificate,它是标准证书颁发机构的证书列表,与浏览器用来验证https://URL的证书相当。这允许Python、wget和其他工具验证服务器提供的证书。

第二个是NetBase,它在/etc中安装一些文件,将某些名称映射到相应的端口或协议。例如,/etc/services将服务名称(如https)映射到相应的端口号,在本例中为443/tcp。

接下来,安装编译器工具链,下载Python源代码,编译Python,然后卸载不需要的Debian包:

运行set-ex\\&;&;avedAptMark=";$(apt-mark showManual)";\&;&;apt-get update&;&;Apt-get install-y--no-install-推荐\dpkg-dev\GCC\libBluetooth-dev\libbz2-dev\libc6-dev\libexpat1-dev\libffi-dev\libgdbm-dev\liblzma-dev\libncursesw5-dev\libreadline-dev\libsqlite3-dev\libssl-dev\";GPG";默认情况下不再包含$(COMMAND-V gpg&>;/dev/null||ECHO';GnuPG dirmngr';)\\&;&;wget-O python.tar.xz";https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz";\&;&;wget-O python.tar.xz.asc";Https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc";\&;&;导出GNUPGHOME=";$(mktemp-d)";\&;&;--Batch--keyserver ha.pool.sks-keyservers.net--recv-key";$gpg_key";\&;&;Gpg--Batch--验证python.tar.xz.asc python.tar.xz\&;&;{command-v gpgconf>;/dev/null&;&;gpgconf--全部删除||:;}\&;rm-rf";$GNUPGHOME";python.tar.xz.asc\&;&;mkdir-p。Tar-xjc/usr/src/python--strie-component=1-f python.tar.xz\&;&;&;rm python.tar.xz\\&;&;cd/usr/src/python\&;&;gnuArch=";$(dpkg-Architecture--query DEB_BUILD_GNU_TYPE)";\&;&;/configure\--。\--enable-loadable-sqlite-tensions\--enable-Optimations\--enable-option-checking=FATAL\--enable-Shared\-with-system-expat\-with-system-ffi\--less-ensurepip\&;&;make-j";$(Nproc)";\LDFLAGS=";-wl,--strie-all";\&;&;make install\。Rm-rf/usr/src/python\\&;&;find/usr/local-Deep\\(\\(-type d-a\(-name test-o-name test-o-name空闲_test\)\)\-o\(-type f-a\(-name';*.pyc';-o-name';*.pyo';-o-name';*.a';\)\-o\(-type f-a-name';wininst-*.exe&*39;\)\\)-exec rm-rf';{}';+\\&;&;ldconfig\\&;&;apt-mark auto&39;.*';>;/dev/null\&;&;apt-mark手册$avedAptMark\&;查找/usr/local-type f可执行文件-非\(-name';*tkinter*';\)-exec ldd';{}&39;';';\|awk';/=>;/{print$(NF-1)}';\|排序-u\|xargs-r dpkg-query--搜索\|剪切-d:-f1\|排序-u\|xargs-r apt-mark手册\&;&;Apt-get purge-y--auto-remove-o apt::AutoRemove::RecommendsImportant=false\&;&;rm-rf/var/lib/apt/list/*\\&;&;python3--版本。

编译Python所需的包-GCC等-一旦不再需要就会被删除。

因为所有这些都发生在单个运行命令中,所以映像最终不会将编译器存储在其任何层中,从而使其保持较小。

您可能会注意到一件事,Python需要libBluetooth-dev来编译,我发现这很令人惊讶,所以我问,显然Python可以创建蓝牙套接字,但只有在安装了这个包的情况下才能编译。

#创建一些预期存在的有用符号链接,运行cd/usr/local/bin\&;&;ln-s idle3空闲\&;&;ln-s pydoc3 pydoc\&;&;ln-s python3 python\&;&;ln-s python3-config python-config。

PIP包下载工具有自己的发布时间表,这与Python的不同。例如,此Dockerfile安装的是2020年7月发布的Python 3.8.5。PIP 20.2.2是在8月份发布的,但Dockerfile确保包含较新的PIP:

#如果这被调用";pip_version";,pip将使用";ValueError:无效的真值';<;版本>;';";ENV Python_PIP_Version 20.2.2#https://github.com/pypa/get-pip ENV Python_GET_PIP_URLENV Python_GET_PIP_SHA256 d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1 Run Set-ex;\\SavedAptMark=";$(apt-mark showManual)";;\apt-get update;\apt-get install-y--no-install-推荐wget;\\wget-O get-Pip.py";$Python_GET_PIP_URL";;\ECHO";$Python_GET_PIP_SHA256*get-py.py";|sha256sum-check-strict-;\\apt-mark auto'。>;/dev/null;\[-z";$avedAptMark";]||apt-mark手动$avedAptMark;\apt-get purge-y--auto-remove-o apt::AutoRemove::RecommendsImportant=false;\rm-rf/var/lib/apt/list/*;\\python get-Pip.py\-Disable-pip-version-check\-。Pip==$Python_pip_version";\;\pip--version;\\find/usr/local-Deep\\(\\(-type d-a\(-name test-o-name test-o-name IDLE_test\)\)\-o\\(-type f-a\(-name';*.pyc';-o-name';-o-name';*.pyo';\)\)\\)-exec rm-rf';{}';+;\rm-f get-pin.py。

通过使用带有空入口点的CMD,当您运行镜像时,默认情况下会得到python:

$docker run-it python:3.8th-buster Python 3.8.5(默认,2020年8月4日,16:24:08)[GCC 8.3.0]linuxType";help";,";版权";,";信用&34;或";许可证";了解更多信息。>;>;>;

虽然这一点似乎显而易见,但值得注意的是它是如何包含的:它是/usr/local中的自定义安装。

对于使用此基本映像的人来说,一个常见的错误是使用Debian版本的Python重新安装Python:

这会在/usr而不是/usr/local中安装额外的Python,并且通常是不同版本的Python。您可能不希望在同一映像中安装两个不同版本的Python;大多数情况下,这只会导致混淆。

如果您真的想使用Debian版本的Python,那么可以使用debian:buster-slm作为基本映像。

例如,上一次发布Python3.5是在2019年11月,但是用于python:3.5-slm-buster的Docker映像包含来自2020年8月的pip。这(通常)是一件好事,它意味着您可以获得最新的错误修复、性能改进以及对更新的轮子变体的支持。

如果您希望略微加快启动速度,那么您可能希望将标准库源代码编译为您自己的映像中的.pyc文件,该文件包含Compileall模块。

虽然基本debian:buster-slm和python映像确实经常重新生成,但有些窗口已经发布了新的Debian安全修复程序,但是映像尚未重新生成。您应该安装基本Linux分发版的安全更新。

了解如何构建快速、可投入生产的Docker映像-阅读针对Python的Docker打包指南的其余部分。

从为您节省时间的快速构建到保证您安全的安全最佳实践,您如何快速获得打包Python应用程序用于生产所需的专业知识?

通过使用Docker Production QuickStart上的Python,快速了解最佳实践。

你需要在就业市场上保持竞争力--但是要学的东西太多了,你不知道从哪里开始。

加入2100多名Python开发人员和数据科学家的行列,学习实用工具和技术,从Docker打包到Python最佳实践,每周在您的收件箱中都会有一篇免费的新文章。