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

Dockerfile

文章目录

  • 1. 前言
  • 2. Dockerfile 指令
  • 3. 编写Dockerfile
  • 4. 最佳实践

1. 前言

Dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于描述镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。通过编写Dockerfile ,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。

Dockerfile 的基本几个包含以下几个部分:

  • 基础镜像:使用FROM指令可以指定基础镜像,在此基础镜像基础上,我们可以来开发自己的镜像。基础镜像一般包含了基础操作系统(ubuntu/centos)以及一些预装的工具与软件
  • 维护者信息:包含维护者名字,版本和时间
  • 镜像操作指令:使用一系列指令来描述构建的过程
  • 容器启动指令:使用CMD或ENTRYPOINT指令来定义容器启动时要执行的命令

镜像的构建分为三个步骤:

  • 编写dockerfile 文件
  • 使用docker build来构建镜像
  • docker run 启动与运行镜像

2. Dockerfile 指令

Dockerfile 使用#进行注释,一个Dockerfile文件就是以下指令编写而成的一个文件:

指令描述格式
FROM指定基础镜像,当前新镜像是基于哪个镜像的FROM <image>[:<tag>] [AS <name>]
MAINTAINER镜像维护者的姓名和邮箱地址,已被官方弃用,可以使用LABEL maintainer="…"来替代MAINTAINER <name>
LABEL用于向 Docker 镜像添加元数据(Metadata)。这些元数据是键值对形式的标签,用于描述镜像的各个方面,例如维护者信息、版本、描述、构建日期等,可以通过docker inspect 查看标签信息LABEL <key>=<value> <key>=<value> <key>=<value> …
USER指定后续指令(RUN, CMD, ENTRYPOINT)以哪个用户身份运行。为了安全,应避免使用 root 用户。
RUN容器构建时需要运行的命令,最佳实践:将多个RUN命令用 && 连接成一个,以减少镜像层数RUN <command>
EXPOSE当前容器对外保留出的端口EXPOSE <port> [<port>/<protocol>…]
WORKDIR指定在创建容器后,终端默认登录的进来工作目录WORKDIR /path/to/workdir
ENV用来在构建镜像过程中设置环境变量ENV <key>=<value> …
ARG设置仅在构建过程中的临时变量。容器运行时无法访问ARG <name>[=<default value>]
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包ADD [–chown=<user>:<group>] <src>… <dest>
COPY类似ADD,拷贝文件和目录到镜像中,但不解压COPY [–chown=<user>:<group>] <src>… <dest>
VOLUME容器数据卷,用于数据保存和持久化工作VOLUME <path>
CMD指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效CMD command param1 param2
ENTRYPOINT指定一个容器启动时要运行的命令,多个指令时不容易被覆盖ENTRYPOINT [“executable”, “param1”, “param2”]
ONBUILD当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

3. 编写Dockerfile

创建Dockerfile 文件,并编写,下面提供一个最简单的镜像

# 用来注释
# 第一部分 基础镜像
FROM alpine# 第二部分 维护者信息
LABEL maintiner="Peter·Pan爱编程" \name="demo"# 第三部分 镜像操作指令
RUN echo dockerfiletest# 第四部分 镜像启动指令
CMD ["echo successfully"]

用户可以从Docker Hub中找到更多的基础镜像
使用下面指令可以编译镜像

sudo docker build -t myalpine:v1.0 -f ./Dockerfile .

编译完成后,使用docker images能找到镜像:
在这里插入图片描述
使用docker run 运行镜像

sudo docker run -it --rm --name myalpine myalpine:v1.0 /bin/sh

4. 最佳实践

  1. 用多阶段构建:如上例所示,可以极大地减小最终镜像的大小。
  2. 合理排序指令:将最不可能变化的指令(如COPY requirements.txt和RUN install)放在前面,充分利用 Docker 的构建缓存,加速构建过程。多个RUN指令尽量使用&&来进行合并处理,减小镜像的大小
  3. .dockerignore:创建一个 .dockerignore 文件来排除不需要的文件(如.git, node_modules, .env),避免它们被复制到镜像中,增加大小并可能引发问题。
  4. 选择合适的基础镜像:优先选择官方、轻量级(如-slim, -alpine)的镜像。
  5. 一个容器一个进程:保持容器的单一职责,使其更易于管理、扩展和调试。
http://www.xdnf.cn/news/1341757.html

相关文章:

  • Claude Code 已支持【团队版】和【企业版】订阅
  • Webpack的使用
  • 15. 多线程(进阶2) --- CAS 和 多线程常用的类
  • Mokker AI:一键更换照片背景的AI神器
  • 粗粮厂的基于flink的汽车实时数仓解决方案
  • selenium一些进阶方法如何使用
  • K8s快速上手-微服务篇
  • 机器学习中的聚类与集成算法:从基础到应用
  • 前端视频流处理从 0 到 “能跑”:可复制 Demo+WebGL/Worker 优化,覆盖会议 / 直播 / 监控场景
  • 【尝试】在macOS上安装cvat
  • 【51单片机】【protues仿真】基于51单片机水位监测系统
  • 鸿蒙开发中的List组件详解
  • 机器学习-集成算法
  • Django的生命周期
  • 项目1总结其三(图片上传功能)
  • leetcode-python-242有效的字母异位词
  • 阿里巴巴推出Qoder:面向真实软件开发的智能编程平台
  • 计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
  • 计算机视觉第一课opencv(三)保姆级教学
  • 大语言模型原理(Transformer架构)
  • c# 和 c++ 怎样结合
  • Chrome 插件开发实战:从入门到进阶
  • Docker:安装配置
  • 【框架篇二】FastAPI路由与请求处理
  • Linux 网络命令大全
  • uniapp 自定义组件封装、easycom匹配规则
  • 2025-08-21 Python进阶4——错误和异常
  • 用 Python 写的自动化测试 WPF 程序的一个案例
  • 【GaussDB】使用gdb定位GaussDB编译package报错
  • Spring Boot整合Amazon SNS实战:邮件订阅通知系统开发