生产Python Docker 镜像选择-Slim 版本(python:3.12-slim)

生产Python Docker 镜像选择-Slim 版本(python:3.12-slim)

生产Python Docker 镜像选择-Slim 版本

制作 Python Docker 镜像的最佳实践
参考链接:https://developer.aliyun.com/article/1436674

结论:
建议使用官方的 python slim 镜像作为基础镜像,Slim 才是主流生产环境的最佳实践。不建议使用 Alpine 作为 Python 的基础镜像。

python:3.12-slim

Python 3.12 镜像精简版FROM python:3.12-slim

对于在不断发展的软件部署领域中摸索的开发者和小型企业主来说,选择正确的 [Docker]镜像可能会成就或毁掉您项目的效率。

python 3.12 slim 镜像在极简主义和功能之间提供了引人注目的平衡,使其成为可扩展技术工具和智能业务解决方案的理想基础。

python 3.12 slim 镜像是一个官方 Python]镜像,构建于最小的 Debian 基础之上,去除了不必要的软件包,以保持镜像尺寸较小——通常约为 30-40 MB,而完整的 [Python]镜像则为 100+ MB。

python:3.12-slim 是一个在体积与功能之间取得良好平衡的官方镜像,适合大多数中小型 Python 项目的容器化部署。

主要特点:

  • 体积小:相比标准 python:3.12(约 900MB),slim 版本更轻量,便于快速拉取和部署。
  • 兼容性良好:基于 glibc,支持大多数 Python 包,尤其是需要编译 C 扩展的库(如 numpy、pandas)。
  • 安全性更高:减少不必要的组件,降低潜在攻击面。
  • 适合 Web 项目、API 服务、科学计算等场景。

Alpine 版本

大多数 Linux 发行版使用 GNU 版本(glibc)的标准 C 库,几乎每个 C 程序都需要这个库,包括 Python。但是 Alpine Linux 使用 musl, Alpine 禁用了 Linux wheel 支持。
理由如下:
• 缺少大量依赖
• CPython 语言运行时的相关依赖
• openssl 相关依赖
• libffi 相关依赖
• gcc 相关依赖
• 数据库驱动相关依赖
• pip 相关依赖
• 构建可能更耗时
• Alpine Linux 使用 musl,一些二进制 wheel 是针对 glibc 编译的,但是 Alpine 禁用了 Linux wheel 支持。现在大多数 Python 包都包括 PyPI 上的二进制 wheel,大大加快了安装时间。但是如果你使用 Alpine Linux,你可能需要编译你使用的每个 Python 包中的所有 C 代码。

glibc 和 musl python兼容性问题

  • Wheel 是预编译二进制包,是 Python 的预编译二进制包格式(.whl 文件)。
  • glibc 和 musl 是 Linux 系统的 C 标准库,负责系统调用、内存管理等底层功能。
    关键问题:glibc 和 musl 的二进制接口(ABI)不同,为 glibc 编译的程序无法在 musl 上运行。

manylinux 是 Python 官方制定的 Linux wheel 标准,确保同一个二进制包能在多个 Linux 发行版上通用运行。
问题所在:

  • 99% 的 wheel 是 manylinux(为 glibc 编译)
  • Alpine 只支持 musllinux wheel(很少有包提供)
  • Alpine 兼容性差,尤其是涉及 C 编译的库,如 numpy、uvloop、psycopg2
  • slim 是推荐默认生产镜像:体积和功能的良好平衡
  • 不要在生产中用 full 版除非你真的需要所有工具

Read more

融资3000万美元,服务2000+团队!听Dify专家拆解如何把AI从Demo变生产力

融资3000万美元,服务2000+团队!听Dify专家拆解如何把AI从Demo变生产力

整理 | 梦依丹      出品 | ZEEKLOG(ID:ZEEKLOGnews) 近日,开源 AI 应用开发平台 Dify 宣布完成 3000 万美元 Pre-A 轮融资,由红杉领投,GL Ventures、Alt-Alpha Capital、五源资本、瑞穗力合投资和 NYX Ventures 跟投,目前公司估值已达 1.8 亿美元。 这家从“原型工具”杀出来的黑马,如今已服务全球超 140 万台设备、2000+ 团队和 280 家企业(包括马士基、安克创新等),正朝着“全球 AI 应用工作流标准定义者”狂奔。 那么,Dify 是如何用“

By Ne0inhk
MySQL 总结|MySQL 从入门到高级

MySQL 总结|MySQL 从入门到高级

摘要:本文全面系统地讲解了 MySQL 从基础操作到高级特性的核心知识,内容涵盖数据库基础概念、SQL 核心语法、索引与性能优化、事务与锁机制、InnoDB 引擎原理、主从复制等关键技术。 1. MySQL 概述 1.1 数据库相关概念 本部分将讲解三个核心概念:数据库、数据库管理系统、SQL。 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase数据库管理系统操纵和管理数据库的大型软件DataBase Management System SQL操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准Structured Query Language  2. SQL语句 全称 Structured Query Language(结构化查询语言),是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。无论使用 Oracle、SQL Server 还是 MySQL 等关系型数据库,均可以通过 SQL 语言进行统一操作,因此掌握

By Ne0inhk
大模型开发 - Spring AI 之 @McpTool、@McpPrompt、@McpResource

大模型开发 - Spring AI 之 @McpTool、@McpPrompt、@McpResource

文章目录 * 引言 * MCP 协议的三大能力 * 能力对比表 * 三者的关系与数据流 * Prompt 能力深解 * 什么是 Prompt? * 服务器端:@McpPrompt 定义 * 客户端:通过 McpSyncClient 调用 Prompt * 第一步:列举所有 Prompt * 第二步:获取具体的 Prompt 内容(含参数) * Prompt 的应用场景 * 场景 1:构建系统 Prompt 库 * 场景 2:多语言 Prompt 管理 * 场景 3:工作流模板 * Resource 能力深解 * 什么是 Resource? * 服务器端:@McpResource 定义 * 支持的资源类型 * 客户端:

By Ne0inhk

嵌入式软件代码架构详解,超清晰图解为什么需要软件架构,以及告诉你怎么实现软件架构

我希望你能够带着几个问题进入到下面的文章中,我会用生动的例子告诉你为什么需要软件架构,以及一个简单的软件架构是什么样子的。在看文章的过程中,你要有意识的思考这几个问题,希望看完这篇文章,你就能回答出下面几个问题了。 1.为什么需要软件架构? 2.好的软件架构有哪些标准,能够解决掉什么问题? 3.软件架构长什么样子?文章看完了你能够画出来嘛? 一、 告别“面条代码”,嵌入式为何更需要软件架构? 1.1 从两个场景说起 当你拿到一块新的开发板,兴致勃勃地开始你的嵌入式项目时,是不是经常这样开始你的main.c? 场景A(新手期):功能堆砌的“面条代码” 这就是经典的“面条代码”(Spaghetti Code)——所有逻辑像一碗面条一样缠绕在一起。 它有些什么样的问题呢? * main函数无限膨胀: 所有功能都堆在while(1)循环里,代码越来越长,越来越难阅读。 * “牵一发而动全身”: 你想修改按键的逻辑,可能会影响到ADC采样;想移除蜂鸣器功能,得小心翼翼地从一大坨代码里找出所有相关行。 * 高度耦合: 业务逻辑(按键控制LED)

By Ne0inhk