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


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-bookwormCOPY --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.mzph.cn/news/115451.shtml

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

相关文章

云服务器搭建Hadoop分布式

文章目录 1.服务器配置2.Java环境3. 安装Hadoop4. 集群配置5. 编写集群的启动脚本 1.服务器配置 服务器主机名配置115.157.197.82s110核115.157.197.84s210核115.157.197.109s310核115.157.197.31s410核115.157.197.60gracal10核 所有的软件安装在/opt/module下&#xff0c;软…

3BHE003855R0001 UNS2882A 用于嵌入式/工业用途的人工智能盒

3BHE003855R0001 UNS2882A 用于嵌入式/工业用途的人工智能盒. 无风扇iBOX 1200系列包括型号iBOX-1265 UE/iBOX-1245 UE/iBOX-1215 UE&#xff0c;由第12代英特尔酷睿i7/i5/i3处理器(Alder Lake-P)提供动力&#xff0c;通过英特尔Iris Xe显卡和两个DDR4 3200MHz SO-DIMM提供高达…

麒麟信安受邀协办2023广电五舟行业交流大会,共建信创产业新生态

10月20日&#xff0c;广州广电五舟科技股份有限公司&#xff08;简称“广电五舟”&#xff09;主办的行业交流大会召开&#xff0c;大会围绕智能算力新趋势、共建新生态价值体系、算力发展与生态建设的关系、元宇宙应用展望与生态融合等话题展开深入探讨。麒麟信安作为沈阳站和…

【广州华锐互动】三维全景3D消防科普展馆

在我们的日常生活中&#xff0c;火灾安全是一个不容忽视的重要问题。然而&#xff0c;由于缺乏对火灾的了解和应对技巧&#xff0c;许多人在面对火灾时往往感到无助和恐慌。为了解决这个问题&#xff0c;广州华锐互动开发了三维全景3D消防科普展馆&#xff0c;它是一个以虚拟现…

CorelDRAW和InDesign软件的功能区别

Corel和Ilustrator都是基于矢量的排版软件。另一方面&#xff0c;InDesign的主要目的是基于包含不同基本网格设计&#xff0c;以及标题和段落样式信息的母版页来制作多页面布局&#xff0c;例如杂志或书籍&#xff0c;这为了使出版物保持一致。 CorelDRAW图形套件是加拿大Core…

hello react

react中文官网 一、什么是react React是一个由Facebook开源的JavaScript库&#xff0c;用于构建用户界面。它基于组件化的思想&#xff0c;将界面拆分成多个独立的、可复用的组件&#xff0c;并通过组件之间的交互构建整个用户界面。React使用虚拟DOM&#xff08;Virtual DOM…

不拼花哨,只拼实用:unittest指南,干货为王!

Python为开发者提供了内置的单元测试框架 unittest&#xff0c;它是一种强大的工具&#xff0c;能够有效地编写和执行单元测试。unittest 提供了完整的测试结构&#xff0c;支持自动化测试的执行&#xff0c;能够对测试用例进行组织&#xff0c;并且提供了丰富的断言方法。最终…

接口自动化测试工具大全

在互联网时代&#xff0c;服务端测试已经成为一个重要的产品保障手段&#xff0c;各对此公司实施的方法和技术也不同&#xff0c;本文我们就来讨论一下。 互联网服务端接口自动化是各个公司都需要一部分业务&#xff0c;如何快速高效地完成接口测试呢&#xff1f; 以帮助大家实…

redhat配置本地yum源(超详细,超简单)

目录 ​编辑 1、硬件配置 2、配置本地yum源 1、硬件配置 注意这里要使用iso文件&#xff0c;并且要选择启动时连接 2、配置本地yum源 创建本地源文件夹 mkdir -p /mnt/cdrom 挂载镜像文件至指定的目录 mount /dev/cdrom /mnt/cdrom 备份本地源 cp -rf /etc/yum.repos.d…

星途星纪元 ES,用艺术思维表达工程技术

10月8日&#xff0c;星途星纪元ES携手世界级成都爱乐首席乐团、旅德青年钢琴家王超&#xff0c;在成都打造了一场“万物星声”超舒适音乐会视听盛宴。这是星途星纪元首次跨界音乐圈、牵手音乐挚友&#xff0c;共同演绎音乐和汽车的美学协奏曲&#xff0c;开启高端超舒适美学新纪…

如何解决git 发生冲突的场景?

一、是什么 一般情况下&#xff0c;出现分支的场景有如下&#xff1a; 多个分支代码合并到一个分支时多个分支向同一个远端分支推送 具体情况就是&#xff0c;多个分支修改了同一个文件&#xff08;任何地方&#xff09;或者多个分支修改了同一个文件的名称 如果两个分支中…

Python树莓派开发

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

卷积神经网络CNN学习笔记-卷积计算Conv2D函数的理解

目录 1.全连接层存在的问题2.卷积运算3.填充(padding)3.1填充(padding)的意义 4.步幅(stride)5.三维数据的卷积运算6.结合方块思考7.批处理8.Conv2D函数解析9.conv2d代码9.1 stride19.2 stride2 参考文章 1.全连接层存在的问题 在全连接层中&#xff0c;相邻层的神经元全部连接…

vue3+ts父子组件以及单页面刷新的方法

父子组件刷新页面&#xff1a; 父组件定义函数reset&#xff0c;子组件props接收 示例一&#xff1a; 父组件 //ts删减部分&#xff1a; import { deleteCompanyById, findAllCompanys } from /api/company import { usePureFetch } from /nexus/useFetch import type Compa…

CUDA学习笔记(十三) Shared Memory

CUDA SHARED MEMORY shared memory在之前的博文有些介绍&#xff0c;这部分会专门讲解其内容。在global Memory部分&#xff0c;数据对齐和连续是很重要的话题&#xff0c;当使用L1的时候&#xff0c;对齐问题可以忽略&#xff0c;但是非连续的获取内存依然会降低性能。依赖于…

基于Pix4D使用无人机光学影像制作正射影像(DOM)和数字表面模型(DSM) 操作步骤

基于Pix4D使用无人机光学影像制作正射影像&#xff08;DOM&#xff09;和数字表面模型&#xff08;DSM&#xff09; 操作步骤 0. 前言1.获取无人机光学影像2.DOM和DSM3.操作步骤3.1 初始界面3.2 新建项目3.3查看处理过程报告3.4查看处理进度和成果 4.在ArcMap中打开DSM和DOM 0.…

django基于Python的房价预测系统+爬虫+大屏可视化分析

欢迎大家点赞、收藏、关注、评论 文章目录 前言一、项目介绍二、开发环境三、功能需求分析1 数据采集功能设计2数据管理功能设计3爬虫功能需求分析4 数据可视化功能需求分析数据库表的设计 四、核心代码五、效果图六、文章目录 前言 房价是一个国家经济水平的重要体现&#xff…

找不到mfc140u.dll无法继续执行此代码的5个修复方法分享

是使用计算机的过程中&#xff0c;我们经常会遇到各种各样问题&#xff0c;其中丢失“mfc140u dll”&#xff08;动态链接库&#xff09;是最常见的一种。DLL文件是一种可在多个程序之间共享的代码库&#xff0c;它可以被应用程序在运行时动态加载和卸载。而“mfc140u dll”则是…

熟练使用 Redis 的五大数据结构:Java 实战教程

入门 入门阶段主要记住 Redis 的命令&#xff0c;熟练使用 Redis 的 5 大数据结构就可以了。 如果没有 Redis 环境&#xff0c;可以直接通过这个网址https://try.redis.io/&#xff0c;很赞&#xff0c;它会给你模拟一个在线的环境可供你尽情使用&#xff01; 熟练使用Redis的…

变分贝叶斯深度学习综述

**©PaperWeekly 原创 作者 |**薛博阳 **单位 |**香港中文大学 **研究方向 |**语言模型 引言 近年来&#xff0c;贝叶斯深度学习&#xff08;Bayesian Deep Learn-ing&#xff09;在诸多领域得到广泛关注应用&#xff0c;效果显著。本文将针对贝叶斯深度学习框架进行系…