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

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.xdnf.cn/news/10644.html

相关文章:

  • 【Redis】Set 集合
  • Python列表、字典、元组、集合
  • 推荐一款使用html开发桌面应用的工具——mixone
  • 39. 组合总和【 力扣(LeetCode) 】
  • 从万物互联到万体智联:论智能体互联网带来的产业革命
  • 可视化大屏如何制作
  • SQL快速入门【转自牛客网】
  • 强人工智能 vs 弱人工智能:本质区别与未来展望
  • CppCon 2014 学习:Defensive Programming Done Right.
  • 嵌入式Linux 期末复习指南(下)
  • Java递归编程中的StackOverflowError问题分析与解决方案
  • 软件测评师教程 第9章 基于质量特性的测试与评价 笔记
  • 新版智慧社区(小区)智能化弱电系统解决方案
  • 记录一次由打扑克牌测试国内各家大模型的经历
  • 序列搜索策略
  • 探秘 Minimax:AI 领域的创新先锋
  • CangjieMagic 智能体框架嵌入式系统实测:以树莓派 4B 为例
  • 【Redis技术进阶之路】「系统架构系列中篇」高可用之Master-Slave主从架构的复制问题(分析旧版点制功能)
  • rabbitmq Direct交换机简介
  • K-匿名模型
  • 强类型语言和弱类型语言
  • 振动力学:有阻尼单自由度系统
  • 极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆
  • RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)
  • 房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块
  • 洛谷-P3912素数个数题解
  • 模型训练的“隐形杀手”——过拟合!全面解析与实用应对方案
  • MySQL中的锁
  • 【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C
  • 29 C 语言内存管理与多文件编程详解:栈区、全局静态区、static 与 extern 深度解析