如何创建高效的 Python Docker 镜像详解

news2024/11/16 19:27:31


Docker是打包和部署容器中应用程序的行业标准软件。Docker镜像是构建和运行应用程序的基础,为了充分发挥Docker的潜力,您需要优化镜像以提高资源效率、安全性和性能。这将确保您的应用程序在Docker生态系统内无缝运行。

通过一个实际示例来学习如何实现这一点,演示如何将Python计算器应用程序容器化。

从最小的基础镜像开始

影响Docker镜像效率的因素之一是基础镜像的选择。您应该从一个只包括运行应用程序所需的基本组件的最小镜像开始。

您使用的镜像还应来自可信赖的来源,提供安全更新和补丁。它应该有一个活跃的社区和良好的文档。这在解决问题或寻求帮助时非常有帮助。

对于计算器应用程序,选择python:3.11-slim-bookworm这个最小镜像可以减小镜像的大小,从而减小资源消耗并加快镜像的下载和部署速度。

从最小的基础镜像开始
FROM python:3.11-slim-bookworm AS builder

您还可以选择更小的Alpine Linux镜像,选择python:3.11-alpine。然而,这个镜像不包括Python解释器、包管理器和常见的Python库。

以非root用户身份运行应用程序

以root用户身份运行Docker容器可能会带来重大的安全风险。如果恶意行为者能够访问以root身份运行的容器,他们可以利用容器软件中的漏洞来升级其权限。然后,他们可以使用这些权限来执行对主机系统的完全控制的命令。

解决方案是将应用程序以非root用户身份运行。计算器示例创建并配置了用户calculator。

为安全性设置非root用户
RUN adduser calculator --system

将用户添加到calculator组
RUN addgroup calculator && adduser calculator calculator

为您的应用程序创建一个专用用户会限制潜在攻击者可用的权限。这会增加利用漏洞的难度。

复制必要的文件并创建虚拟环境

在Docker容器内创建虚拟环境可以隔离依赖关系。这可以防止与系统范围的软件包和其他应用程序的冲突。它还确保版本兼容性,因为您可以安装应用程序需要的确切版本的依赖项,而不会影响系统的其余部分。

将必要的文件复制到容器中。然后,使用Python内置的venv模块为计算器应用程序创建一个虚拟环境。

设置工作目录并复制必要的文件
WORKDIR /app
COPY app.py .
COPY requirements.txt .
COPY config.json ./

从本地目录复制config.json
创建虚拟环境并安装依赖项
RUN python -m venv /venv
ENV PATH="/venv/bin:$PATH"
RUN /venv/bin/pip install --upgrade pip --no-cache-dir --requirement requirements.txt

虚拟环境是轻量级和高效的,因为它们不会复制系统范围的软件包。这有助于保持Docker镜像的较小大小,并在容器运行时减少资源消耗。

为提高效率减少层

Dockerfile中的每个指令都会在生成的镜像中创建一个新的层。Docker使用写时复制机制来管理这些层。减少Docker镜像中层次的数量显著提高了镜像的大小和构建性能。减少层次的一种方法是将多个命令合并到单个RUN指令中。

# 为提高效率减少层
# 合并命令以减少层的数量
RUN echo "构建过程在这里" && \
/venv/bin/python -m compileall . && \
rm -rf __pycache__

将上述命令合并起来可以减少在镜像构建过程中创建的中间层的数量。

保护配置处理的安全性

在Docker镜像中处理敏感信息会带来安全风险。为了增强安全性,您应该使用环境变量和外部配置文件。在计算器应用程序示例中,您可以创建一个名为/config的目录来存储配置文件,并设置适当的所有权。

# 保护配置处理的安全性
RUN mkdir /config && chown calculator:calculator /config

然后将config.json文件复制到此目录中,确保它与应用程序代码分开。

# 将config.json文件复制到容器中
RUN cp config.json /config/config.json
ENV CONFIG_PATH=/config/config.json

将配置数据与代码分离并应用适当的权限可以增强Docker镜像的整体安全性。这确保只有授权的进程或用户可以访问关键的配置数据。

使用多阶段构建
多阶段构建允许您将构建环境与最终镜像分开。这会导致更小、更专注的生产镜像。它还通过从最终镜像中排除与构建相关的工具和文件来增强安全性。这减小了攻击面,减少了与不必要组件相关的潜在安全风险。

# 利用多阶段构建
FROM python:3.11-slim-bookworm

COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group
COPY --from=builder /venv /venv
COPY --from=builder /config /config
COPY --from=builder /app /app
# 复制应用程序代码

上述代码只将构建阶段(builder)中的必要部分复制到最终镜像中。这通过排除运行计算器应用程序所需的构建相关工具和文件来减小镜像大小。

通过镜像扫描增强安全性

为了进一步增强Docker镜像的安全性,请使用像Trivy或Clair这样的镜像扫描工具。这些工具旨在识别图像层和依赖性中的漏洞。对于计算器应用程序,请使用Trivy进行漏洞扫描。

# 为Debian/Ubuntu安装Trivy
RUN apt-get update && \
apt-get install -y wget apt-transport-https gnupg lsb-release && \
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | apt-key add - && \
echo "deb https://aquasecurity.github.io/trivy-repo/deb bookworm main" \
| tee -a /etc/apt/sources.list.d/trivy.list && \
apt-get update && \
apt-get install -y trivy

将Trivy漏洞扫描添加到Docker镜像中非常重要。这是因为它使用通用漏洞和暴露(CVE)数据库,该数据库定期更新包含已知漏洞的信息。这有助于确保您的镜像始终使用最新的安全补丁,并保护您的应用程序免受已知攻击的影响。

要获取有关您的镜像的漏洞报告,请使用以下命令。

docker run --rm `
-v /var/run/docker.sock:/var/run/docker.sock `
-v $HOME/Library/Caches:/root/.cache/ `
aquasec/trivy:0.18.3 `
<your image name>

上述命令将需要一些时间来运行。运行完毕后,将生成报告。

严重性越高,您就应该更快地解决已识别的漏洞。

以非 root 用户身份运行应用程序

为了增强安全性,以calculator用户身份运行应用程序,以限制潜在的漏洞。

# 以非根用户身份运行应用程序
WORKDIR /app
USER calculator

# 激活虚拟环境并运行应用程序
CMD ["/bin/bash", "-c", "source /venv/bin/activate && python app.py"]

切换到非 root 用户可以最小化攻击面。

容器化非Python应用程序

使用其他编程语言开发的应用程序的Docker容器化方式有所不同。您应该熟悉如何容器化不同类型的应用程序。这将帮助您根据应用程序使用的语言类型决定采用的最佳策略。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享一个基于JavaWeb的私人牙科诊所预约挂号就诊系统的设计与实现项目源码调试 lw 开题 ppt

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

学习笔记---不容错过的顺序表的应⽤~~

目录​​​​​​​ 1. 基于动态顺序表实现通讯录项⽬ 1.1 通讯录&#x1f4c7;功能要求 1.2 总体思路分析&#x1f9d0; 1.3 创建初始化销毁顺序表&#x1f31e; 1.3.1 contact.h 1.3.2 Seqlist.h 1.3.3 contact.c 1.3.4 text.c 1.3.5 代码运行测试 1.3.6 二次代码测…

旋转图像(C++解法)

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输…

Pytorch深度学习 - 学习笔记

文章目录 Pytorch深度学习1. Pytorch加载数据初认识2. TensorBoard3. Transforms常见的transform 4. torchvision中的数据集使用5. DataLoader使用6. 神经网络6.1 神经网络的基本骨架6.2 卷积层6.3 最大池化的使用6.4 非线性激活6.5 线性层及其他层6.6 小实战及Sequential 7. 损…

苹果手机内存清理怎么做?5招教你拯救内存!

大家的手机内存还能坚持多久呢&#xff1f;无论是什么牌子的手机&#xff0c;只要使用的时间越久&#xff0c;手机的内存必然会越来越小。如果不及时清理手机里的历史缓存、垃圾文件等数据&#xff0c;就会导致手机变得迟缓、卡顿。 那么&#xff0c;我们该怎么做呢&#xff1…

如何使用 GoGoCode 一键 Vue2 转换 Vue3

前言 从今年年初开始&#xff0c;项目开始升级优化&#xff0c;将之前的 Vue2 旧版本整体升级到 Vue3 版本。在重写了几个 Vue 文件后&#xff0c;我发现做的都是一些机械性的工作&#xff0c;效率低且重复性大。于是就试着搜索了一下有没有什么能够批量转换代码格式的工具&am…

SPE(Single Pair Ethernet)

以太网标准 讲SPE&#xff08;Single Pair Ethernet&#xff09;之前我们先了解一下以太网标准&#xff1a; CategoryStandardCable length(m)Data rateDuplex CapabilityWiresFast Ethernet10/100BASE-T10010Mb/s to 100Mb/sFull4Gigabit Ethernet1000/10GBAST-T1001Gb/s to …

UOS系统无法开机问题解决

1、问题截图1 &#xff1a; 2、问题截图2 &#xff1a; 3、问题截图3&#xff1a; 解决方案&#xff1a; 修复磁盘无效&#xff0c;建议拷贝数据&#xff0c;还原系统 请先拷贝数据 进live模式在root a或root b 或系统盘找到Home文件夹里-找到用户名-里面就是用户的数据&am…

四川竹哲电商:抖店怎么修改经营类目?

抖店是抖音推出的一款电商工具&#xff0c;通过抖店可以帮助商家在抖音上开展经营活动。在抖店平台上&#xff0c;商家需要选择经营类目&#xff0c;以便在相应的领域展示商品和提供服务。然而&#xff0c;有时候商家可能需要修改经营类目&#xff0c;以适应经营策略调整或扩大…

什么是无磁远传水表?工作原理是怎样的?

无磁远传水表是一种新型的智能水表&#xff0c;与传统水表相比&#xff0c;它具有更高的精度和可靠性&#xff0c;并且可以实现远程读数和控制。那么&#xff0c;无磁远传水表的工作原理是怎样的呢?下面&#xff0c;小编来为大家介绍下什么是无磁水表?它的工作原理是怎样的&a…

MySQL 三大日志(bin log、redo log、undo log)

redo log redo log (重做日志) 是 InnoDB 存储引擎独有的&#xff0c;它让 MySQL有了崩溃恢复的能力&#xff0c;是事务中实现 持久化的重要操作 比如 MySQL 实例宕机了&#xff0c;重启时&#xff0c;InnoDB 存储引擎会使用 redo log 恢复数据&#xff0c;保证数据的持久性与…

数字孪生技术:重塑企业经营的未来

在当今数字化时代&#xff0c;企业经营面临了前所未有的挑战和机遇。数字孪生技术作为新一代数字化工具&#xff0c;正在成为企业走向成功的关键。数字孪生是一种通过数字模型在虚拟世界中模拟和反映物理实体、过程和系统的技术&#xff0c;它为企业经营带来了许多重要的帮助。…

Sourcetree突然打不开,双击打开,图片闪一下就没反应了

解决方案如下&#xff1a; 1.点击图标&#xff0c;右键点击“打开文件所在位置 2.返回上一级&#xff0c;找到Atlassian文件夹 3.进入此文件夹下&#xff0c;删除SourceTree.exe_Url文件夹 4.再双击桌面的Sourcetree图标&#xff0c;可以正常打开。 最近刚遇到此问题&#x…

【广州华锐互动】智慧水务3D可视化数字孪生大屏定制开发

污水处理流程的复杂性需要一种有效的方法进行理解和优化。传统的2D图表和文字描述方法往往无法全面、直观地展示污水处理的各个环节。然而&#xff0c;智慧排水3D数字化管控系统可以为污水处理流程提供更深入、更全面的理解&#xff0c;从而帮助改进污水管理。 首先&#xff0c…

Vue2双向数据绑定的原理

Vue.js 是采用数据劫持结合发布者-订阅者模式的方式&#xff0c;通过Object.defineProperty()来劫持各个属性的setter&#xff0c;getter&#xff0c;在数据变动时发布消息给订阅者&#xff0c;触发相应的监听回调 Vue双向数据绑定主要有以下几个步骤&#xff1a; 模板解析 事件…

为何说只有 1 种实现线程的方法?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 今天我们来学习为什么说本质上只有一种实现线程的方式&#xff1f;实现 Runnable 接口究竟比继承 Thread 类实现线程好在哪里&#xff1f; 实现线程是并发编程中基础中的基础&#xff0c;因为我们必须要先实现多线程…

虹科活动 | 探索全新AR应用时代,虹科AR VIP研讨会广州场回顾!

文章来源&#xff1a;虹科数字化AR 阅读原文&#xff1a;https://mp.weixin.qq.com/s/7tmYR42Tw5XLn70fm8Nnew 主题演讲 本次研讨会&#xff0c;虹科特邀 “工业AR鼻祖” 美国Vuzix公司的首席应用工程师郑慎方先生进行主题演讲&#xff0c;并邀请到了各界的专业人士和企业代表参…

ESRI ArcGIS Pro 3.0-3.0.2图文安装教程及下载

ArcGIS 是由美国著名的地理信息系统公司 Esri 开发的一款地理信息系统软件。ArcGIS Pro是一款功能强大的单桌面 GIS 应用程序&#xff0c;是在桌面上创建和处理空间数据的基本应用程序。ArcGIS Pro支持数据可视化和数据高级分析&#xff0c;可以创建 2D 地图和3D 场景。它支持跨…

无需公网IP,通过内网穿透轻松搭建微信公众号开发本地调试环境!

文章目录 前言1. 配置本地服务器2. 内网穿透2.1 下载安装cpolar内网穿透2.2 创建隧道 3. 测试公网访问4. 固定域名4.1 保留一个二级子域名4.2 配置二级子域名 5. 使用固定二级子域名进行微信开发 前言 在微信公众号开发中&#xff0c;微信要求开发者需要拥有自己的服务器资源来…

如何建立风险、内控与合规三位一体的管控体系?

为指导企业开展风险管理工作&#xff0c;进一步提高管理水平&#xff0c;增强竞争力&#xff0c;促进稳步发展&#xff0c;自2006年开始&#xff0c;我国国资委、财政部等相关部委借鉴COSO理论及国际上影响较大的风险管理和内部控制标准&#xff0c;结合国内的实际情况&#xf…