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

Dockerfile 常见语法和指令

Dockerfile 常见语法和指令

  1. FROM

    • 作用: 指定基础镜像,构建过程从该镜像开始。
    • 语法: FROM <image>[:<tag>] [AS <name>]
    • 示例:
      FROM node:18.18.0-alpine AS builder
      
      指定使用 node:18.18.0-alpine 作为基础镜像,并命名为 builder(用于多阶段构建)。
  2. WORKDIR

    • 作用: 设置容器内的工作目录,后续指令(如 COPYRUN)都在此目录下执行。
    • 语法: WORKDIR /path/to/workdir
    • 示例:
      WORKDIR /app
      
      设置工作目录为 /app
  3. COPY

    • 作用: 将文件或目录从主机复制到容器内的指定路径。
    • 语法: COPY [--chown=<user>:<group>] <src> <dest>
    • 示例:
      COPY package*.json ./
      
      将主机的 package.jsonpackage-lock.json 复制到容器的工作目录。
  4. ADD

    • 作用: 类似 COPY,但支持从 URL 下载文件或解压 tar 文件。
    • 语法: ADD <src> <dest>
    • 示例:
      ADD . /app
      
      将当前目录下的所有文件复制到容器内的 /app 目录。
  5. RUN

    • 作用: 在构建镜像时执行命令,通常用于安装依赖、运行脚本等。
    • 语法:
      • Shell 格式: RUN <command>
      • Exec 格式: RUN ["executable", "param1", "param2"]
    • 示例:
      RUN npm install --loglevel verbose
      
      在构建时执行 npm install 安装依赖。
  6. CMD

    • 作用: 指定容器启动时默认执行的命令(仅一个 CMD 有效)。
    • 语法:
      • Shell 格式: CMD <command>
      • Exec 格式: CMD ["executable", "param1", "param2"]
    • 示例:
      CMD ["nginx", "-g", "daemon off;"]
      
      容器启动时运行 Nginx,并保持前台运行。
  7. EXPOSE

    • 作用: 声明容器运行时监听的端口(仅起文档作用,不自动发布端口)。
    • 语法: EXPOSE <port> [<port>/<protocol>]
    • 示例:
      EXPOSE 80
      
      声明容器监听 80 端口。
  8. ENV

    • 作用: 设置环境变量,可在后续指令或容器运行时使用。
    • 语法: ENV <key>=<value>
    • 示例:
      ENV TZ=Asia/Shanghai
      
      设置时区为 Asia/Shanghai
  9. ARG

    • 作用: 定义构建时的变量,仅在构建过程中有效(不会传递到运行时的容器)。
    • 语法: ARG <name>[=<default value>]
    • 示例:
      ARG BUILD="npm run build"
      
      定义变量 BUILD,默认值为 npm run build
  10. LABEL

    • 作用: 为镜像添加元数据(如维护者、版本等)。
    • 语法: LABEL <key>=<value> ...
    • 示例:
      LABEL maintainer="****"
      
      添加维护者信息。
  11. ENTRYPOINT

    • 作用: 指定容器启动时执行的命令,适合定义容器的主要可执行程序。
    • 语法:
      • Shell 格式: ENTRYPOINT <command>
      • Exec 格式: ENTRYPOINT ["executable", "param1", "param2"]
    • 示例:
      ENTRYPOINT ["node", "app.js"]
      
      容器启动时运行 node app.js
  12. VOLUME

    • 作用: 定义匿名卷,用于持久化数据。
    • 语法: VOLUME <path>
    • 示例:
      VOLUME /data
      
      创建一个挂载点 /data
  13. USER

    • 作用: 指定后续指令或容器运行时的用户(默认是 root)。
    • 语法: USER <user>[:<group>]
    • 示例:
      USER nginx
      
      nginx 用户运行后续命令。
  14. HEALTHCHECK

    • 作用: 定义容器健康检查的方式。
    • 语法:
      HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1
      
      每 30 秒检查容器健康状态。
  15. ONBUILD

    • 作用: 定义当该镜像被用作其他镜像的基础镜像时触发的指令。
    • 语法: ONBUILD <instruction>
    • 示例:
      ONBUILD COPY . /app
      
      当其他镜像基于此镜像时,复制文件到 /app
  16. Multi-Stage Builds

    • 作用: 使用多个 FROM 指令实现多阶段构建,优化镜像大小。
    • 示例:
      FROM node:18.18.0-alpine AS builder
      # 构建阶段
      FROM nginx:stable-alpine
      COPY --from=builder /app/dist /usr/share/nginx/html
      
      builder 阶段复制构建产物到最终镜像。

Dockerfile 语法特点

  • 指令大小写: 指令通常大写(如 FROMRUN),但不强制。
  • 注释: 以 # 开头。
    # This is a comment
    
  • 多行指令: 使用反斜杠 \ 换行。
    RUN npm config set registry https://registry.npmmirror.com/; \npm install --loglevel verbose
    
  • 指令顺序: Dockerfile 按顺序执行,每条指令创建一个新层。
  • 缓存机制: Docker 会缓存每层的结果,修改 Dockerfile 可能导致缓存失效。

最佳实践

  1. 最小化镜像: 使用轻量级基础镜像(如 alpine),清理不必要的文件。
  2. 合并命令: 减少 RUN 指令层数,合并多条命令。
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
    
  3. 多阶段构建: 仅将必要文件复制到最终镜像。
  4. 明确版本: 指定镜像版本(如 node:18.18.0-alpine),避免使用 latest
  5. 避免不必要的文件: 使用 .dockerignore 排除无关文件(如 node_modules)。

示例

# Stage 1: Build
FROM node:16.17.0-alpine AS builder
ARG BUILD="npm run build"
WORKDIR /app
COPY package*.json ./
RUN npm config set registry http://<REDACTED_REGISTRY>; \npm install --loglevel verbose
ADD . /app
RUN $BUILD# Stage 2: Production
FROM <REDACTED_REGISTRY>/nginx:stable-alpine-v2
LABEL maintainer="<REDACTED_MAINTAINER>"
ARG TARGET_FILE="dist"
ENV TZ=Asia/Shanghai
COPY --from=builder /app/$TARGET_FILE /usr/share/nginx/html
RUN set -eux; \ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; \echo $TZ > /etc/timezone
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

使用说明

  • 文件作用: 该 Dockerfile 定义了一个两阶段构建过程:
    • 第一阶段使用 Node.js 环境构建前端项目(默认运行 npm run build)。
    • 第二阶段使用 Nginx 镜像,将构建产物复制到 Nginx 的 HTML 目录,配置时区并启动 Nginx 服务。
  • 如何使用:
    1. 保存 Dockerfile 到本地。
    2. 替换 <REDACTED_XXX> 占位符为实际的 registry 地址和维护者信息。
    3. 运行 docker build -t my-image . 构建镜像。
    4. 运行 docker run -p 80:80 my-image 启动容器。
http://www.xdnf.cn/news/398269.html

相关文章:

  • 青少年编程与数学 02-019 Rust 编程基础 08课题、字面量、运算符和表达式
  • RDD的五大特征
  • DICOM 网络服务实现:医学影像传输与管理的技术实践
  • Hadoop的组成,HDFS架构,YARN架构概述
  • 互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析
  • 学习日志03 java
  • 【Java继承】——面向对象编程的基石
  • ngx_http_limit_conn_module精准连接控制
  • C#里WPF使用触发器实现鼠标点击响应
  • 谷歌Gemini生图升级:与GPT-4o的对决,谁更胜一筹?
  • 克隆虚拟机组成集群
  • Python爬虫第20节-使用 Selenium 爬取小米商城空调商品
  • Electron学习大纲
  • 从零开始的python学习(七)P89+P90+P91+P92+P93+P94
  • 关于高并发GIS数据处理的一点经验分享
  • flutter 的 json序列化和反序列化
  • 南京邮电大学金工实习答案
  • 全模态具身智能:从 VLM 到 MLLM
  • Multisim14使用教程详尽版--(2025最新版)
  • 【网络原理】数据链路层
  • 场馆订 场馆预订平台 数据库设计
  • 如何构建通用深度反思(deep-research)能力的Agent?
  • 5.串口的输入输出
  • redis数据结构-04 (HINCRBY、HDEL、HKEYS、HVALS)
  • 牛客周赛 Round 92-题解
  • Java并发编程实战
  • 简单的强化学习举例
  • 笔试阶段性心得总结
  • 模块化编程
  • ACM模式手动构建二叉树