dockerfile-learning
Dockerfile 完全指南:所有指令语法详解及实战示例
一、Dockerfile 指令全集
1. FROM
语法:FROM [–platform=
说明:设置基础镜像,必须是第一条有效指令(ARG除外)
示例:
1 | FROM ubuntu:20.04 |
2. RUN
语法:
Shell格式:RUN
Exec格式:RUN [“executable”, “param1”, “param2”]
说明:执行命令并创建新的镜像层
示例:
1 | RUN apt-get update && apt-get install -y \ |
3. CMD
语法:
Exec格式(推荐):CMD [“executable”,”param1”,”param2”]
Shell格式:CMD command param1 param2
作为ENTRYPOINT参数:CMD [“param1”,”param2”]
说明:设置容器启动时默认执行的命令
示例:
1 | CMD ["python", "app.py"] |
4. LABEL
语法:LABEL
说明:添加元数据到镜像
示例:
1 | LABEL version="1.0" |
5. EXPOSE
语法:EXPOSE
说明:声明容器运行时监听的端口
示例:
1 | EXPOSE 80/tcp |
6. ENV
语法:
ENV
ENV
说明:设置环境变量
示例:
1 | ENV NODE_ENV=production |
7. ADD
语法:ADD [–chown=
说明:复制文件/目录/URL到镜像,支持自动解压
高级特性:
1 | ADD --chown=1000:1000 file.txt /app/ |
8. COPY
语法:COPY [–chown=
说明:复制本地文件到镜像(推荐优先使用)
与ADD区别:
1 | COPY --chown=node:node package*.json ./ |
9. ENTRYPOINT
语法:
Exec格式:ENTRYPOINT [“executable”, “param1”, “param2”]
Shell格式:ENTRYPOINT command param1 param2
说明:配置容器启动时运行的命令
与CMD组合:
1 | ENTRYPOINT ["top", "-b"] |
10. VOLUME
语法:VOLUME [“/data”]
说明:创建挂载点并标记为外部挂载卷
重要特性:
1 | VOLUME /var/log |
运行时自动创建匿名卷
11. USER
语法:USER
说明:设置运行用户
示例:
1 | USER nobody |
12. WORKDIR
语法:WORKDIR /path/to/workdir
说明:设置工作目录
特点:
1 | WORKDIR /app |
13. ARG
语法:ARG
说明:定义构建时的变量
使用场景:
1 | ARG APP_VERSION=latest |
构建时:docker build –build-arg APP_VERSION=1.21
14. ONBUILD
语法:ONBUILD
说明:设置镜像被用作基础镜像时执行的指令
示例:
1 | ONBUILD COPY . /app/src |
15. STOPSIGNAL
语法:STOPSIGNAL signal
说明:设置停止容器的系统信号
示例:
1 | STOPSIGNAL SIGTERM |
16. HEALTHCHECK
语法:
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
选项:
1 | HEALTHCHECK --interval=5m --timeout=3s \ |
17. SHELL
语法:SHELL [“executable”, “parameters”]
说明:覆盖默认的shell
示例:
1 | SHELL ["/bin/bash", "-c"] |
二、VOLUME 指令深入解析
1. 基本用法
1 | VOLUME ["/data"] |
2. 多卷声明
1 | VOLUME ["/var/log", "/var/db"] |
3. 运行时行为
自动创建匿名卷
数据会持久化但难以管理(推荐显式挂载)
4. 最佳实践
1 | # 1. 在Dockerfile中声明 |
三、多阶段构建完整示例
1 | # 第一阶段:构建应用 |
四、高级特性实战
1. 构建时变量与运行时变量
1 | ARG BUILD_VERSION |
2. 缓存优化
1 | # 先复制依赖文件,利用缓存层 |
3. 安全加固
1 | FROM alpine |
五、.dockerignore 文件
示例:
1 | # 忽略所有.md文件 |
六、构建上下文优化
最小化上下文:
1 | # 创建专用目录 |
使用远程URL:
1 | ADD https://example.com/file.tar.gz /tmp/ |
七、完整企业级示例
1 | # syntax=docker/dockerfile:1.4 |
八、常见问题解决方案
1. 权限问题
1 | RUN mkdir -p /data && chown -R 1000:1000 /data |
2. 时区设置
1 | RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
3. 清理缓存
1 | RUN apt-get update && apt-get install -y \ |
九、性能优化技巧
构建缓存:
1 | # 变化频率低的指令放前面 |
多阶段构建:
1 | FROM node:16 as build |
十、安全最佳实践
最小权限原则:
1 | RUN adduser --disabled-password appuser |
不存储敏感数据:
1 | # 错误做法 |