转发请注明出处:

一、Dockerfile 核心语法规则

  1. 指令大写:所有指令必须大写(如 FROMRUN
  2. 顺序执行:指令按顺序从上到下执行
  3. 分层构建:每条指令生成一个镜像层,修改上层不会影响下层
  4. 注释支持:使用 # 符号添加注释
  5. 基础镜像:必须包含 FROM 指令作为第一条指令

二、常用指令详解

指令 作用 示例
FROM 指定基础镜像 FROM ubuntu:20.04
RUN 执行命令并提交结果 RUN apt-get update && apt-get install -y curl
COPY 复制本地文件到镜像 COPY ./app /app
ADD 复制文件并支持自动解压(推荐优先使用 COPY) ADD https://example.com/file.tar.gz /tmp
CMD 定义容器启动默认命令(可被覆盖) CMD ["python", "app.py"]
ENTRYPOINT 定义容器启动主命令(不可被覆盖,可组合使用) ENTRYPOINT ["python"]
WORKDIR 设置工作目录 WORKDIR /app
EXPOSE 声明容器监听端口 EXPOSE 80
ENV 设置环境变量 ENV NODE_ENV=production
VOLUME 创建挂载点 VOLUME /data
ARG 定义构建参数(仅在构建时有效) ARG USER_ID=1000
USER 指定运行用户 USER root
LABEL 添加元数据 LABEL maintainer="your@email.com"
ONBUILD 定义镜像作为其他镜像基础时执行的指令(较少使用) ONBUILD RUN echo "Building child image"

三、典型使用场景示例

示例1:构建 Node.js 应用镜像

# 使用官方 Node.js 镜像作为基础
FROM node:18-alpine # 设置工作目录
WORKDIR /app # 复制 package.json 并安装依赖
COPY package*.json ./
RUN npm install --production # 复制应用代码
COPY . . # 暴露应用端口
EXPOSE 3000 # 定义启动命令
CMD ["npm", "start"]

构建命令:

docker build -t my-node-app .

运行命令:

docker run -p 3000:3000 my-node-app

示例2:Python Web 服务镜像

# 使用 Python 官方镜像
FROM python:3.11-slim # 设置环境变量
ENV PYTHONUNBUFFERED=1 # 创建工作目录
WORKDIR /code # 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
python3-dev \
&& rm -rf /var/lib/apt/lists/* # 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码
COPY . . # 启动命令
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myapp.wsgi"]

2.构建优化技巧:

  1. 使用 .dockerignore 文件排除无关文件
  2. 合并 RUN 指令减少层数:
RUN apt-get update \
&& apt-get install -y package \
&& rm -rf /var/lib/apt/lists/*

3.多阶段构建(减小最终镜像体积):

# 构建阶段
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp # 最终阶段
FROM alpine:latest
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

四、关键注意事项

  1. 层缓存机制:Dockerfile 修改后,只有修改后的指令及其后续指令会重新执行
  2. 安全最佳实践:
    • 避免以 root 用户运行最终容器
    • 使用最小基础镜像(如 alpine)
    • 定期更新基础镜像
  3. 多阶段构建:适用于需要编译环境但运行时不需要的情况(如 Go/C++ 应用)
  4. 健康检查:
    HEALTHCHECK --interval=30s --timeout=3s \
    CMD curl -f http://localhost/ || exit 1

五、调试技巧

  1. 进入容器调试:

    docker run -it my-image /bin/bash
  2. 查看构建历史:
    docker history my-image
  3. 查看镜像详细信息:

    docker inspect my-image

参考链接:

  https://docs.docker.com/reference/dockerfile/

Dockerfile 语法与常用命令的更多相关文章

  1. Dockerfile 中对常用命令详解

    说明 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 在Dockerfile 中命令书写对先后顺序及表示其执行对顺序,在书写时需注意. 约定 命令不 ...

  2. Windows PowerShell基本语法及常用命令

    PowerShell常用命令: 一 Get类 1.Get-Command : 得到所有PowerShell命令,获取有关 cmdlet 以及有关 Windows PowerShell 命令的其他元素的 ...

  3. Java基础—基础语法与常用命令

    一.基础语法 1.case不加break会有穿透效果 根据阿里规范,严禁省略default语句,即使它一句话也没有 2.for循环执行顺序: for(初始化1;条件2;迭代运算3){ 循环体4: } ...

  4. docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。

    一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...

  5. Docker常用命令和Dockerfile语法

    Linux安装Docker: sudo wget -qO- https://get.docker.com/ | sh 安装后只能用root管理,要给其他用户权限,使用命令: sudo usermod ...

  6. docker命令、简单创建镜像、dockerfile实战、Dockerfile语法、镜像分层、Volume介绍

    docker的常用命令: docker pull 获取imagedocker build 创建imagedocker images 列出imagedocker run 运行containerdocke ...

  7. sqlite3常用命令&语法

    sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,SQLite大量的被用于手机,PDA,MP3播放器以及机顶盒设备.    Mozilla Firefox使用SQLit ...

  8. grep,awk和sed的常用命令和语法

    Grep的常用命令语法 1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来.例如:“m y s t r i n g”.这样做有两个原因,一是以防被误解为 s h ...

  9. linux基本语法和常用运维命令

    linux上的操作一般是命令行操作,看起来很高大上,让人畏而远之. Help!Help! 忽然间闯入的linux黑黑的世界,怎么办,不要慌.赶紧敲出一个help命令,然后回车,黑色的窗口就会展示一些常 ...

  10. Linux常用命令语法+示例

    原文出自:https://blog.csdn.net/seesun2012 Linux常用命令:Linux查看日志命令总结:Tomcat相关:Linux配置网卡,连接外网:Linux下安装JDK:Li ...

随机推荐

  1. Qt项目架构经验总结

    (一)通用规则 除了极小的微型demo级别项目外,其余项目建议用pri分门别类不同文件夹存放代码文件,方便统一管理和查找. 同类型功能的类建议统一放在一起,如果该目录下代码文件数量过多,也建议拆分多个 ...

  2. SHA256 64 位加密

    /// <summary> /// SHA256 64位加密 /// </summary> /// <param name="input">&l ...

  3. [转]VS2019生成项目文件.lib或.dll或exe后如何拷贝到指定的目录文件夹

    VS2019编译CloudCompare,发现生成的项目文件都是分开的,每个项目下都有自己的文件夹Debug/Release,生成Dll都放在这些单独的项目文件夹内. 目标 (1)通常,我们要求所有的 ...

  4. [转]Clion+mingw环境下Assimp编译

    1.Clion+mingw环境下Assimp编译 2.MinGW-w64下载

  5. IM开发干货分享:IM客户端不同版本兼容运行的技术思路和实践总结

    本文由巩鹏军分享,原题"IM兼容性基建",本文有修订. 1.引言 一个成熟的IM成品,在运营过程中随着时间的推移,会发布不同的版本,但为了用户体验并不能强制要求用户必须升级到最新版 ...

  6. HTTP协议超级详解【转载】

    HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的基础. ...

  7. 「V 曲闲谈」《hello&bye,days》——记这周

      这周破事儿浓度真的,情绪渗透压巨大失调.   完全没有曲析啊喂,顶多当个阅读时 BGM.() 两度失眠   "砰--"   朦胧之中看见斜上方的室友起身.   "砰- ...

  8. ABAP配置:OY01 定义国家/地区

    配置:OY01 定义国家/地区 事务代码:OY01 配置路径: SPRO-ABAP平台-常规设置-设置国家-定义国家/地区 配置路径截图: 配置描述: 国家是SAP里面一个非常重要的概念,SAP国家概 ...

  9. Win2D 投影效果 ShadowEffect

    <Page x:Class="Win2DDemo.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/ ...

  10. Android基础入门教程-参考资料

    2)看视频 网上关于Android的视频教程有很多,这里分享下基神力荐的黑马教程吧: 黑马28期Android全套视频无加密完整版:密码:h7jz 52期不加密版:密码:zve8 当然下面这些视频学习 ...