网站首页 > 文章精选 正文
一、什么是 Dockerfile?
Dockerfile 是一个文本文件,其中包含一条条构建镜像所需的指令。Docker 引擎会按顺序执行这些指令,逐步构建出最终的自定义镜像。
二、Dockerfile 常用指令详解
指令 | 说明 | 示例 |
FROM | 指定基础镜像,必须是第一条 | FROM ubuntu:20.04 |
LABEL | 添加元数据,如作者信息 | LABEL maintainer="you@example.com" |
ENV | 设置环境变量 | ENV PATH=/usr/local/bin:$PATH |
RUN | 执行命令(用于安装软件、配置等) | RUN apt update && apt install -y nginx |
COPY | 将文件从宿主机复制到镜像中 | COPY . /app |
ADD | 类似 COPY,但支持自动解压 tar.gz | ADD app.tar.gz /app |
WORKDIR | 设置工作目录,后续命令将在此目录运行 | WORKDIR /app |
EXPOSE | 声明容器运行时监听的端口(不做端口映射) | EXPOSE 80 |
CMD | 设置默认启动命令(容器启动时执行) | CMD ["python3", "app.py"] |
ENTRYPOINT | 设置容器主命令,可与 CMD 配合 | ENTRYPOINT ["nginx"] |
VOLUME | 创建挂载点以供数据持久化 | VOLUME /data |
ARG | 构建时参数(类似 ENV,但只在构建时有效) | ARG VERSION=1.0 |
USER | 设置运行命令的用户 | USER appuser |
三、Dockerfile 示例详解
示例 1:定制一个 Python Web 服务镜像
# 1. 指定基础镜像
FROM python:3.11-slim
# 2. 设置环境变量
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 3. 设置工作目录
WORKDIR /app
# 4. 复制依赖清单
COPY requirements.txt .
# 5. 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 6. 复制应用代码
COPY . .
# 7. 声明服务端口
EXPOSE 8000
# 8. 启动应用(可以用 gunicorn 或 flask 等)
CMD ["python", "app.py"]
四、多阶段构建(Multi-stage Builds)
用于优化镜像大小,减少构建后不需要的内容。
示例:构建 Go 项目
# 构建阶段
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN go build -o server main.go
# 运行阶段
FROM alpine
WORKDIR /app
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]
五、最佳实践与技巧
技巧 | 说明 |
使用官方镜像 | 尽量从 python, node, alpine, ubuntu 等官方镜像起步 |
减少 RUN 层数 | 使用 && 合并多个命令,并加上 \ 换行清晰可读 |
使用 .dockerignore 文件 | 类似 .gitignore,避免把 node_modules、.git 等文件复制进镜像 |
使用 --no-cache-dir 安装依赖 | 减少层的体积,避免缓存问题 |
合理使用 CMD 和 ENTRYPOINT | 组合使用以实现灵活的命令行参数传递 |
六、镜像构建命令
# 构建镜像(-t 设定镜像名:标签)
docker build -t myapp:latest .
# 构建时传入构建参数
docker build --build-arg VERSION=1.2 -t myapp:v1.2 .
# 查看本地镜像
docker images
七、运行容器
# 启动容器并映射端口
docker run -d -p 8080:8000 myapp:latest
# 挂载卷共享文件
docker run -v /host/path:/container/path myapp
八、.dockerignore 文件示例
.git
__pycache__/
*.pyc
node_modules/
.env
防止无关或敏感文件被复制进镜像。
九、总结
通过 Dockerfile,你可以:
- 定制化基础环境(如 Python、Node、Java)
- 打包完整项目和依赖
- 优化构建流程和镜像体积
- 实现自动化部署(配合 CI/CD)
- 上一篇: Linux日常小技巧Docker打包
- 下一篇: 三 docker 镜像命令
猜你喜欢
- 2025-05-22 离线在docker镜像方式部署ragflow0.17.2
- 2025-05-22 【Docker 新手入门指南】第七章:镜像使用
- 2025-05-22 使用Docker制作OpenJDK镜像
- 2025-05-22 使用Dockerfile build镜像
- 2025-05-22 一文详解Docker轻量级虚拟化,镜像和容器
- 2025-05-22 三 docker 镜像命令
- 2025-05-22 Linux日常小技巧Docker打包
- 2025-05-22 使用Dockerfile制作自己的docker镜像
- 2025-05-22 使用dockerfile构建docker镜像
- 2025-05-22 转移Docker桌面系统和镜像文件细节剖析教程
- 05-22离线在docker镜像方式部署ragflow0.17.2
- 05-22【Docker 新手入门指南】第七章:镜像使用
- 05-22使用Docker制作OpenJDK镜像
- 05-22使用Dockerfile build镜像
- 05-22一文详解Docker轻量级虚拟化,镜像和容器
- 05-22三 docker 镜像命令
- 05-22Docker-使用Dockerfile 定制镜像
- 05-22Linux日常小技巧Docker打包
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)