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

Dockerfile常用指令介绍

Dockerfile常用指令介绍

Dockerfile是一个文本文件,用于定义Docker镜像的构建过程。下面介绍一些最常用的Dockerfile指令及其用法:

基础指令
  1. FROM - 指定基础镜像

    FROM python:3.9-slim
    

    这是Dockerfile的第一个指令,用于指定构建镜像的基础镜像。

  2. MAINTAINER (已弃用) / LABEL - 设置镜像元数据

    LABEL maintainer="yourname@example.com"
    

    用于添加镜像的作者或其他元数据信息。

  3. RUN - 在镜像中执行命令

    RUN apt-get update && apt-get install -y python3-dev
    

    用于在构建镜像时执行命令,通常用于安装软件包。

  4. COPY - 复制文件到镜像

    COPY ./app /app
    

    第一个参数是源路径,表示要复制的文件或目录
    第二个参数是目标路径(destination path),表示文件将被复制到镜像中的位置
    从构建上下文复制文件或目录到镜像中。

  5. ADD - 更高级的复制指令

    ADD ./app.tar.gz /app
    

    类似于COPY,但可以处理远程URL和自动解压压缩文件。

环境配置
  1. ENV - 设置环境变量

    ENV PYTHONUNBUFFERED 1
    

    为镜像设置环境变量,这些变量在容器运行时也会存在。

  2. WORKDIR - 设置工作目录

    WORKDIR /app
    

    设置RUN、CMD、ENTRYPOINT、COPY和ADD命令的工作目录。

容器运行时配置
  1. CMD - 设置容器启动时默认执行的命令
    CMD ["python", "app.py"]
    

每个 Dockerfile 只能有一个 CMD 指令
如果指定多个,只有最后一个会生效
可以被 docker run 命令后的参数覆盖

  1. ENTRYPOINT - 设置容器入口点

    ENTRYPOINT ["python", "app.py"]
    CMD ["--help"]
    

    设置容器启动时执行的命令,且不会被docker run命令覆盖,但可以追加参数。

  2. EXPOSE - 声明容器端口

    EXPOSE 8000
    

    声明容器运行时提供服务的端口,但不会自动映射端口。

  3. VOLUME - 创建挂载点

    VOLUME /data
    

    创建可以从本地主机或其他容器挂载的挂载点。

用户和权限
  1. USER - 设置运行命令的用户
    USER appuser
    
    设置RUN、CMD和ENTRYPOINT命令执行的用户。
健康检查
  1. HEALTHCHECK - 设置健康检查
    HEALTHCHECK --interval=5m --timeout=3s \CMD curl -f http://localhost/ || exit 1
    
    为容器设置健康检查命令。

简单示例

下面是一个简单的Python Flask应用的Dockerfile示例:

这个Dockerfile的工作流程是:

  1. 基于Python 3.9的轻量级镜像
  2. 设置工作目录为/app
  3. 复制requirements.txt并安装依赖
  4. 复制应用代码到镜像中
  5. 暴露5000端口
  6. 设置Flask应用的环境变量
  7. 定义容器启动时运行的命令

学习Dockerfile最好的方法是实践,建议你尝试构建一些简单的镜像,然后逐步学习更复杂的用法。

FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt# 复制应用代码
COPY . .# 暴露端口
EXPOSE 5000# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0# 运行应用
CMD ["flask", "run"]
http://www.lryc.cn/news/2401054.html

相关文章:

  • Docker 容器化:核心技术原理与实践
  • 不确定性分析在LEAP能源-环境系统建模中的整合与应用
  • 经典算法回顾之最小生成树
  • Ubuntu下实现nginx反向代理
  • c++ QicsTable使用实例
  • 在WordPress上添加隐私政策页面
  • 二维 根据矩阵变换计算镜像旋转角度
  • 你工作中涉及的安全方面的测试有哪些怎么回答
  • 阿里云ACP云计算备考笔记 (3)——云服务器ECS
  • Eigen实现非线性最小二乘拟合 + Gauss-Newton算法
  • 区块链技术:原理、应用与发展趋势
  • 从零开始:用Tkinter打造你的第一个Python桌面应用
  • Web开发主流前后端框架总结
  • Java Spring Boot 自定义注解详解与实践
  • GlobalSign、DigiCert、Sectigo三种SSL安全证书有什么区别?
  • 力扣面试150题--二叉搜索树中第k小的元素
  • SQL Server Agent 不可用怎么办?
  • css-塞贝尔曲线
  • Java并发编程哲学系列汇总
  • docker使用proxy拉取镜像
  • 服务端定时器的学习(一)
  • 【前端】vue 防抖和节流
  • Modbus转EtherNET IP网关开启节能改造新范式
  • Android高级开发第四篇 - JNI性能优化技巧和高级调试方法
  • 【PCB工艺】绘制原理图 + PCB设计大纲:最小核心板STM32F103ZET6
  • C#入门学习笔记 #7(传值/引用/输出/数组/具名/可选参数、扩展方法(this参数))
  • 【DeepSeek】【Dify】:用 Dify 对话流+标题关键词注入,让 RAG 准确率飞跃
  • DELETE 与 TRUNCATE、DROP 的区别
  • yFiles:专业级图可视化终极解决方案
  • VSCode 工作区配置文件通用模板创建脚本