# 常用指令详解（FROM/COPY/RUN/CMD）

URL: https://caijiao.org/docker/dockerfile/instructions
Source: docs/docker/dockerfile/instructions.md
Description: 本章节详细解析 Dockerfile 中常用的指令，包括 FROM、COPY、RUN、CMD 的使用方法与最佳实践，帮助开发者高效构建和管理自定义镜像。

Dockerfile 中的指令定义了镜像构建过程和容器运行行为。本节详细讲解四个核心指令的用法与实践技巧。

## 1. FROM 指令

- 用于指定基础镜像，是 Dockerfile 的首行指令
- 支持官方镜像或自定义镜像
- 可指定版本标签，保证镜像一致性

示例：

```dockerfile
FROM ubuntu:22.04
FROM node:20-alpine
````

- 多阶段构建也使用多个 FROM：

```dockerfile
FROM golang:1.21 AS builder
FROM alpine:latest
```

## 2. COPY 指令

- 将宿主机文件或目录复制到镜像中
- 语法：

```dockerfile
COPY <源路径> <目标路径>
```

示例：

```dockerfile
COPY ./app /app
COPY requirements.txt /app/
```

- COPY 不支持 URL
- 对于远程资源，使用 ADD 指令

## 3. RUN 指令

- 在镜像构建阶段执行命令
- 常用于安装依赖或配置环境

示例：

```dockerfile
RUN apt-get update && apt-get install -y python3
RUN npm install --global yarn
```

- RUN 会生成新的镜像层，建议合并命令减少层数

## 4. CMD 指令

- 指定容器启动时的默认命令
- 可以被 `docker run` 命令行参数覆盖
- 两种格式：

  - exec 格式（推荐）：

```dockerfile
CMD ["python3", "app.py"]
```

- shell 格式：

```dockerfile
CMD python3 app.py
```

- CMD 与 ENTRYPOINT 配合使用，实现更灵活的容器启动

## 5. 使用示例

```dockerfile
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

CMD ["python3", "main.py"]
```

- 构建镜像：

```bash
docker build -t mypythonapp .
```

- 启动容器：

```bash
docker run -d -p 5000:5000 mypythonapp
```

---

理解 FROM、COPY、RUN、CMD 四个核心指令，可以帮助开发者高效构建镜像，并保持镜像体积小、构建快速且易于维护。
