如何创建高效的 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.rhkb.cn/news/165198.html

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

相关文章

Oracle监听服务启动后停止

问题 解决办法 找到listener.ora文件,箭头指的地方&#xff0c;host改为localhost 如何找到listener.ora 其中1522端口&#xff0c;是我新增的监听服务。之前这个host是一个固定的ip地址&#xff0c;我更换网络环境后&#xff0c;ip地址变了&#xff0c;所以导致监听启动失败。…

ChatGPT(1):ChatGPT初识

1 ChatGPT原理 ChatGPT 是基于 GPT-3.5 架构的一个大型语言模型&#xff0c;它的工作原理涵盖了深度学习和自然语言处理技术。以下是 ChatGPT 的工作原理的一些关键要点&#xff1a; 神经网络架构&#xff1a;ChatGPT 的核心是一个深度神经网络&#xff0c;采用了变种的 Tran…

vue-pdf多页预览异常,Rendering cancelled, page 1 Error at BaseExceptionClosure xxx

项目开发使用vue-pdf,单页情况预览正常&#xff0c;多页vue-pdf预览异常&#xff0c;第一次预览时&#xff0c;会先弹出异常模态窗口&#xff0c;关闭模态窗口&#xff0c;pdf又是正常显示&#xff0c;报错信息及异常截图如下&#xff1a; 报错信息 Rendering cancelled, page…

Nginx集群负载均衡配置完整流程

今天&#xff0c;良哥带你来做一个nginx集群的负载均衡配置的完整流程。 一、准备工作 本次搭建的操作系统环境是win11&#xff0c;linux可配置类同。 1&#xff09;首先&#xff0c;下载nginx。 下载地址为&#xff1a;http://nginx.org/en/download.html 良哥下载的是&am…

vulkan SDK安装

文章目录 一. vulcan官网二.安装流程 一. vulcan官网 https://vulkan.lunarg.com/sdk/home#windows 二.安装流程 点击下载 双击下载的*.exe进行安装 点击下一步 点击下一步 选择安装位置&#xff0c;点击下一步 点击全选&#xff0c;选择下一步 勾选同意&#xf…

2023年中国多功能折叠刀产量、销量及市场规模分析[图]

多功能折叠刀是一种集多种功能于一身的刀具&#xff0c;通常包括切割、开瓶、剥皮、锯木等功能&#xff0c;可以通过折叠和展开的方式来实现不同的功能&#xff0c;具有便携、多用途、安全等特点&#xff0c;广泛应用于户外探险、露营、自驾旅行等场景。 多功能折叠刀行业分类…

grafana v10.1版本设置告警

1. 相关概念概述 如图所示&#xff0c;点击切换菜单标志&#xff0c;可以看到警报相关子选项。 警报规则&#xff1a;通过PromQL语句定义告警规则&#xff0c;即达到怎样的状态触发告警。 联络点&#xff1a; 设置当警报规则实例触发时&#xff0c;如何通知联系人&#xff0c;…

使用Perl和WWW::Mechanize库编写

以下是一个使用Perl和WWW::Mechanize库编写的网络爬虫程序的内容。代码必须使用以下代码&#xff1a;jshk.com.cn/get_proxy 首先&#xff0c;确保已经安装了Perl和WWW::Mechanize库。如果没有&#xff0c;请使用以下命令安装&#xff1a; cpan WWW::Mechanize创建一个新的Pe…

代码随想录二刷 Day 44

01背包问题二维做法先遍历背包或者物品都可以&#xff0c;然后是前序遍历&#xff1b; 一维做法一定先遍历物品然后遍历背包&#xff0c;遍历背包的时候是后序遍历&#xff1b;一维做法还是有点难理解&#xff0c;其实就是后面的数字还是要从前面的推导出来&#xff0c;但是如…

安装Apache2.4

二、安装配置Apache&#xff1a; 中文官网&#xff1a;Apache 中文网 官网 (p2hp.com) 我下的是图中那个版本&#xff0c;最新的64位 下载下后解压缩。如解压到D:\tool\Apache24 PS&#xff1a;特别要注意使用的场景和64位还是32位版本 2、修改Apcahe配置文件 2.1配置Apache…

【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍

文章目录 一、ffmpeg1.1 安装1.2 基本参数 二、ffprobe2.1 查编码格式2.2 查视频时长 五、视频转流5.1 MP4转H2645.2 H264转MP45.3 AVI转MP45.4 MP4转H265 六、视频文件6.1 播放6.2 filter 过滤器6.2.1 crop 6.3 视频截取6.4 视频拼接6.5 获取分辨率 七、视频和图7.1 视频抽帧7…

传输层协议(TCP/UDP协议)

全文目录 端口号端口号范围划分 传输层UDP协议特点基于UDP的应用层协议 TCP协议确认应答机制&#xff08;可靠性&#xff09;延迟应答机制超时重传机制流量控制连接管理机制TIME_WAIT 状态CLOSE_WAIT 状态拥塞控制滑动窗口 TCP、UDP对比TCP的listen第二个参数 端口号 在套接字…

jmeter接口测试避坑指南

接口测试看着很简单&#xff0c;但是操作过程中还是出现很多问题&#xff0c;现总结如下&#xff1a; 一、jmeter中乱码问题 可在jmeter.properties 这个文件里面找到sampleresult.default.encodingxx&#xff0c;后面xx改成utf-8&#xff0c;然后取消注释。 解决jmeter的bod…

【RocketMQ系列五】消息示例-顺序消息延迟消息广播消息的实现

1. 前言 上一篇文章我们介绍了简单消息的实现&#xff0c;本文将主要来介绍顺序消息的实现&#xff0c;顺序消息分为局部顺序消息和全局顺序消息。 顺序消息指的是消费者在消费消息时&#xff0c;按照生产者发送消息的顺序进行消费。即先发送的先消费【FIFO】。 顺序消息分为…

vue2升级到vue2.7

vue2升级到vue2.7 小小的改进,大大的提升 只需要简单修改,开发体验得到大大提升. 为什么要升级Vue2.7 不能拒绝的理由: 组合式 API(解决mixins问题:命名冲突,隐式依赖)单文件组件内的 <script setup>语法模板表达式中支持 ESNext 语法(可选链:?.、空值合并:??)单文…

Windows 钉钉多开 dingtalkRC版

亲测可用 下载链接&#xff1a; https://dtapp-pub.dingtalk.com/dingtalk-desktop/win_installer/RC/DingTalk_v6.5.20-RC.7229101.exe

修改echarts的tooltip样式 折线图如何配置阴影并实现渐变色和自适应

图片展示 一、引入echarts 这里不用多解释 vue里使用 import echarts from “echarts”; html页面引用js文件或用script标签引用 二、定义一个具有宽高的dom div <div id"echart-broken" style"width:400px;height: 200px;"></div>三、定义…

Softing为连接PROFIBUS网络提供多种接口产品方案

一 应用广泛的PROFIBUS网络 PROFIBUS是基于统一、标准且独立于应用的通信协议。据PI-China统计&#xff0c;在工业领域里早已有近5090万个PROFIBUS设备被安装在了超过900万节点中。PROFIBUS网络的广泛应用得益于PROFIBUS协议的开放性——用户可以很方便地在PROFIBUS网络的任意…

NXP官方uboot针对ALPHA开发板网络驱动更改说明三

一. 简介 前几篇文章学习了 在 NXP官方uboot上做网络驱动的一部分更改。地址如下&#xff1a; ALPHA开发板网络方案说明-CSDN博客 NXP官方uboot针对ALPHA开发板网络驱动更改说明一-CSDN博客 NXP官方uboot针对ALPHA开发板网络驱动更改说明二-CSDN博客 本文继续来学习在 NXP官…