Dockerfile 语法与常用命令

转发请注明出处:

一、Dockerfile 核心语法规则

  1. 指令大写:所有指令必须大写(如 FROM, RUN
  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="[email protected]"
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/

相关推荐
藥瓿亭2 小时前
K8S认证|CKS题库+答案| 3. 默认网络策略
运维·ubuntu·docker·云原生·容器·kubernetes·cks
背太阳的牧羊人4 小时前
sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境
docker·容器·bash
gsls2008084 小时前
ocrapi服务docker镜像使用
运维·docker·容器
爱宇阳5 小时前
使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)
docker·postgresql·容器
whp4045 小时前
windows server2019 不成功的部署docker经历
运维·docker·容器
木头左9 小时前
Docker容器化技术中的联合文件系统原理探究
docker·容器·eureka
itachi-uchiha10 小时前
Docker部署Hive大数据组件
大数据·hive·docker
deletion丶10 小时前
在 Windows 系统上运行 Docker 容器中的 Ubuntu 镜像并显示 GUI
docker
罗技12314 小时前
我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店
运维·docker·容器
爱宇阳15 小时前
使用 Docker Compose 部署 Jenkins(LTS 版)持续集成环境
ci/cd·docker·jenkins