当前位置: 首页 > news >正文

Docker入门系列——DockerFile的使用

alt

前面了解了Docker的基本概念,今天来认识一下DockerFile。

Dockerfile 是一个文本文件,包含一系列指令来组装 Docker 镜像。每个指令执行一个特定动作,例如安装包、复制文件或定义启动命令。正确使用 Dockerfile 指令对于构建高效容器至关重要。

关键 Dockerfile 指令

  • FROM:设置新镜像的基础镜像。
  • RUN:在当前镜像之上的新层执行命令并提交结果。
  • CMD:指定容器启动时默认运行的命令。
  • COPY:从构建上下文复制文件和目录到容器文件系统。
  • ADD:与 COPY 类似,但具有解压归档等附加功能。
  • ENV:设置环境变量。
  • EXPOSE:告知 Docker 容器在运行时监听的端口。
  • ENTRYPOINT:配置容器作为可执行文件运行。
  • VOLUME:为外部存储卷创建挂载点。
  • WORKDIR:设置后续指令的工作目录。

Dockerfile精华知识点

使用最小基础镜像

基础镜像是您的 Docker 镜像的基础。选择轻量级基础镜像可以显著减少最终镜像大小并最小化攻击面。

  • Alpine Linux:一个流行的最小镜像,大约 5 MB 大小。
FROM alpine:latest

优点:体积小、安全性高、下载速度快。

缺点:可能需要额外配置;一些包可能缺失或因使用 musl 而不是 glibc 而表现不同。

  • Scratch:一个空镜像,适合可以编译静态二进制文件的语言(Go、Rust)。
FROM scratch
COPY myapp /myapp
CMD ["/myapp"]

减少层数

每个 RUNCOPYADD 指令都会向您的镜像添加一个新层。合并命令有助于减少层数和整体镜像大小。

低效:

RUN apt-get update
RUN apt-get install -y python
RUN apt-get install -y pip

高效:

RUN apt-get update && apt-get install -y \
    python \
    pip \
 && rm -rf /var/lib/apt/lists/*

优化层缓存

Docker 使用层缓存来加快构建速度。指令的顺序影响缓存效率。

  • 先复制依赖文件:先复制变化较少的文件(如 package.jsonrequirements.txt),然后再复制其余的源代码。
COPY package.json .
RUN npm install
COPY . .
  • 最小化早期层的变化:早期层的变化会使所有后续层的缓存失效。

明智地安装依赖

安装包后删除临时文件和缓存以减少镜像大小。

RUN pip install --no-cache-dir -r requirements.txt

谨慎管理密钥

永远不要在您的 Dockerfile 中包含敏感数据(密码、API 密钥)。

  • 使用环境变量:在运行时使用环境变量传递密钥。
  • 利用 Docker 密钥:使用 Docker Swarm 或 Kubernetes 机制管理密钥。

优化镜像大小

  • 删除不必要的文件:在同一 RUN 命令中清理缓存、日志和临时文件。这确保这些临时文件不会在任何中间层中持久存在,有效减少最终镜像大小。
RUN apt-get update && apt-get install -y --no-install-recommends package \
      && apt-get clean && rm -rf /var/lib/apt/lists/*

  • 最小化安装的包:使用 --no-install-recommends 等标志只安装所需的包。这避免了不必要的依赖项,进一步减小镜像大小。
RUN apt-get install -y --no-install-recommends package

注意:为了最大化减少镜像大小,请将此安装与清理命令结合在同一个 RUN 语句中,如上所示。

  • 使用优化工具:利用 Docker Slim 等工具可以自动分析和优化您的 Docker 镜像,通过移除不必要的组件和减小大小而不改变功能。

利用 .dockerignore

.dockerignore 文件允许您排除构建上下文中的文件和目录,减少发送到 Docker 守护进程的数据量,并保护敏感信息。

示例 .dockerignore:

.git
node_modules
Dockerfile
.dockerignore

采用多阶段构建

多阶段构建允许您使用中间镜像,并将仅必要的构件复制到最终镜像中。

Go 应用程序的示例:

# 构建阶段
FROM golang:1.16-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 最终镜像
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

以非根用户运行

为了增强安全性,避免以 root 用户运行应用程序。

RUN adduser -D appuser
USER appuser

扫描漏洞

  • 使用扫描工具TrivyAnchoreClair 等工具可以帮助识别已知漏洞。
  • 定期更新镜像:保持基础镜像和依赖项更新。

日志和监控

  • 将日志导向 STDOUT/STDERR:这允许更容易地收集和分析日志。
  • 集成监控系统:使用 Prometheus 或 ELK Stack 等工具监控容器健康。

案例

下面来看一下Node.js 应用程序的优化 Dockerfile 示例

# 使用基于 Alpine Linux 的官方 Node.js 镜像
FROM node:14-alpine

# 设置工作目录
WORKDIR /app

# 复制包文件并安装依赖
COPY package*.json ./
RUN npm ci --only=production

# 复制其余的应用程序代码
COPY . .

# 创建非根用户并切换到它
RUN addgroup appgroup && adduser -S appuser -G appgroup
USER appuser

# 暴露应用程序端口
EXPOSE 3000

# 定义运行应用程序的命令
CMD ["node""app.js"]

其他建议

  • 固定版本:使用基础镜像和包的特定版本以确保构建的可重现性。
FROM node:14.17.0-alpine
  • 保持更新:定期更新依赖项和基础镜像以包含安全补丁。
  • 使用元数据:添加 LABEL 指令以提供镜像元数据。
LABEL maintainer="yourname@example.com"
  • 设置适当的权限:确保文件和目录具有适当的权限。
  • 避免使用根用户:始终切换到非根用户运行应用程序。

结论

创建高效的 Docker 镜像既是一门艺术,也是一门科学。通过遵循编写 Dockerfile 的最佳实践,您可以显著提高容器的性能、安全性和管理性。不断更新您的知识,了解容器化生态系统中的新工具和方法。记住,优化是一个持续的过程,总有改进的空间。

本文由 mdnice 多平台发布

相关文章:

Docker入门系列——DockerFile的使用

前面了解了Docker的基本概念,今天来认识一下DockerFile。 Dockerfile 是一个文本文件,包含一系列指令来组装 Docker 镜像。每个指令执行一个特定动作,例如安装包、复制文件或定义启动命令。正确使用 Dockerfile 指令对于构建高效容器至关重要…...

数据集平台分享

Kaggle: Your Machine Learning and Data Science CommunityKaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.https://www.kaggle.com/Kaggle 包含非常丰富的数据集和代码,…...

去地面算法——depth_clustering算法调试(1)

1 源码下载 论文: 《2016-Fast Range Image-Based Segmentation of Sparse 3D Laser Scans for Online Operation》 《2017-Efficient Online Segmentation for Sparse 3D Laser Scans》 代码:git链接 2 问题记录 2.1 无法找到qt问题 问题截图&…...

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责:每个类应该有一个明确的职责,避免将多个责任混合在一起。降低耦合:通过将不同的职责分开,可以降低类之间的耦合度,提高系统的灵活性。易于维护:当…...

HWA高速辅助驾驶系统组成及功能场景

HWA最基本功能包括智能跟车、拨杆变道、压速变道、车道居中保持等功能,有效减轻驾驶疲劳。随着智能驾驶不断走向成熟,HWA升级到高速自动驾驶HWP,可实现智能避让汇入口、智能避让大车、分心/疲劳监测、智能进出匝道、智能判别易混分叉路口、智…...

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 (一)三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中&…...

kaggle 如何利用API下载数据集

首先 上传kaggle官网生成得 API 密钥: kaggle.json 文件。放到该代码同目录下,再运行一下代码。 注: 只需要修改下载竞赛数据集,就可以选择你的指定数据集。 jupyter文件运行 #首先 上传 kaggle.json 文件并设置 API 密钥 #再…...

第一个 Flutter 项目(1)共46节

前端开发工具vs code,安装Flutter sdk,如果你的下载速度比较慢,可以选择这个😄 flutter sdk 解压码:stwq 配置可以看这Flutter 新建工程一直等待 解决办法-CSDN博客 如果你是新的 Flutter 开发者,我们建…...

学术论文写作丨机器学习与深度学习

目录 第一章、ChatGPT-4o使用方法与技巧 第二章、ChatGPT-4o辅助文献检索、总结与分析 第三章、ChatGPT-4o辅助学术论文选题、创新点挖掘与实验方案设计 第四章、ChatGPT-4o辅助学术论文开题与大纲生成 第五章、ChatGPT-4o辅助学术论文写作马拉松活动介绍 第六章、ChatGP…...

导-4涉及的知识点

除了本课题,3D结构几何修复领域还有以下一些值得关注的研究: 1. **Poisson图像编辑**: 成功地将给定的纹理块融合到可能完全不同的背景图像上。 2. **张量投票(TV)框架**: - 讨论了使用张量投票框架进…...

从0开始深度学习(28)——序列模型

序列模型是指一类特别设计来处理序列数据的神经网络模型。序列数据指的是数据中的每个元素都有先后顺序,比如时间序列数据(股票价格、天气变化等)、自然语言文本(句子中的单词顺序)、语音信号等。 1 统计工具 前面介绍…...

vue2使用 <component> 标签动态渲染不同的表单组件

在后台管理系统中,涉及到大量表单信息的修改和新增。现在想对模板中代码做一些简单的优化。 1. 使用 v-for 循环简化表单项 可以将表单项的定义提取到一个数组中,然后使用 v-for 循环来生成这些表单项。这将减少重复代码,提高可维护性。 2…...

C#实现在windows上实现指定句柄窗口的指定窗口坐标点击鼠标左键和右键的详细情况

在Windows编程中,有时我们需要对特定窗口进行操作,比如模拟鼠标点击。这在自动化测试、脚本编写或某些特定应用程序的开发中尤为常见。本文将深入探讨如何在C#中实现对指定句柄窗口进行鼠标点击操作,包括左键和右键点击。我们会从理论背景开始…...

探索Python自动化新境界:Invoke库的神秘面纱

文章目录 **探索Python自动化新境界:Invoke库的神秘面纱**第一部分:背景介绍第二部分:Invoke库是什么?第三部分:如何安装Invoke库?第四部分:Invoke库函数使用方法1. 定义任务2. 执行任务3. 任务…...

CSS样式实现3D效果

CSS 3D效果是通过CSS3中的transform和perspective等属性来实现的。这些属性允许你创建具有深度感和三维外观的网页元素。以下是一些常见的CSS 3D效果及其实现方法: 1. 3D旋转(Rotate) 使用transform: rotateX(), rotateY(), rotateZ()来分别…...

华为eNSP:MSTP

一、什么是MSTP? 1、MSTP是IEEE 802.1S中定义的生成树协议,MSTP兼容STP和RSTP,既可以快速收敛,也提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡。 2、MSTP可以将一个或多个VLAN映射到一个Inst…...

modbus协议 Mthings模拟器使用

进制转换 HEX 16进制 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15) dec 10进制 n(16进制) -> 10 abcd.efg(n) d*n^0 c*n^1 b*n^2 a*n^3 e*n^-1 f*n^-2 g*n^-3(10) 10 -> n(16进制) Modbus基础概念 高位为NUM_H&…...

内网安全-代理技术-socket协议

小迪安全网络架构图: 背景:当前获取window7 出网主机的shell。 1.使用msf上线,查看路由 run autoroute -p 添加路由: run post/multi/manage/autoroute 使用socks模块开启节点,作为流量跳板 msf6 exploit(multi/ha…...

选择排序(C语言)

一、步骤 选择排序的基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 1.首先,我们先建立一个乱序数组,如&#xff1…...

✍Qt自定义带图标按钮

✍Qt自定义带图标按钮 📝问题引入 近段时间的工作中,有遇到这样一个需求 📝: 一个按钮,有normal、hover、pressed三种状态的样式,并且normal和hover样式下,字体颜色和按钮图标不一样。 分析…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...