当前位置: 首页 > news >正文

Dockerfile——AI教你学Docker

1.8 Dockerfile 详解

Dockerfile 是用于自动构建 Docker 镜像的脚本文件,通过一系列指令描述镜像的基础系统、依赖安装、代码复制、环境变量设置、启动命令等。掌握 Dockerfile 的语法与构建技巧,是容器化开发的核心能力。


一、Dockerfile 基本结构与常用指令

Dockerfile 由一条条指令(通常大写)组成,每条指令对应构建镜像的一层(Layer)。

1. 常用指令说明

  • FROM
    指定基础镜像(必须是第一条有效指令)
    FROM ubuntu:22.04
    FROM node:20-alpine
    
  • LABEL
    添加元数据
    LABEL maintainer="youremail@example.com"
    
  • RUN
    构建时执行命令(如安装依赖),每一条 RUN 都会生成一个新层
    RUN apt-get update && apt-get install -y git
    
  • COPY
    复制本地文件/目录到镜像
    COPY ./src /app/src
    
  • ADD
    类似 COPY,但支持自动解压及远程下载(建议优先用 COPY)
  • WORKDIR
    设定后续指令的工作目录
    WORKDIR /app
    
  • ENV
    设置环境变量
    ENV NODE_ENV=production
    
  • EXPOSE
    声明容器暴露的端口(仅文档作用,需 -p 映射才可外部访问)
    EXPOSE 8080
    
  • CMD
    容器启动时默认执行的命令(可被 docker run 后的命令覆盖,建议用数组形式)
    CMD ["npm", "start"]
    
  • ENTRYPOINT
    设置容器主进程(通常与 CMD 配合),不可被覆盖
  • VOLUME
    声明数据卷挂载点
  • ARG
    构建参数,仅构建阶段有效

2. 指令执行顺序与分层说明

  • Dockerfile 自上而下依次执行,前面的层若未改变会被缓存,加速后续构建。
  • 多余的 RUN/COPY 会增加镜像层数和体积,建议合理合并命令。

二、Dockerfile 示例(常用开发环境)

1. Node.js 项目

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

说明:使用轻量 Alpine 版 node,复制 package.json 优化缓存,生产环境不安装 devDependency。

2. Python Flask 项目

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]

说明:官方 Python 镜像,先安装依赖再复制代码,避免每次代码改动都重新装包。

3. Java Spring Boot 项目

FROM eclipse-temurin:21-jre
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

说明:使用官方 JRE,适合已编译好的 jar 包。

4. Go 项目(多阶段构建)

FROM golang:1.22-alpine AS builder
WORKDIR /src
COPY . .
RUN go build -o myappFROM alpine:latest
WORKDIR /app
COPY --from=builder /src/myapp .
EXPOSE 8080
CMD ["./myapp"]

说明:第一阶段编译 Go 程序,第二阶段用最小 Alpine 镜像只带可执行文件,极致瘦身。

5. PHP + Apache 项目

FROM php:8.2-apache
COPY src/ /var/www/html/
EXPOSE 80

说明:基于官方 PHP-Apache 镜像,直接复制代码目录。

6. .NET Core 项目(多阶段构建)

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /outFROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /out .
EXPOSE 80
ENTRYPOINT ["dotnet", "yourapp.dll"]

说明:先编译再瘦身,生产镜像仅包含运行时和发布产物。

7. Nginx 静态网站

FROM nginx:alpine
COPY ./dist/ /usr/share/nginx/html/
EXPOSE 80

说明:适合 Vue/React 构建后的静态前端项目。

三、开发与构建优化建议

  • 合理合并 RUN 指令,减少镜像层数。
  • 使用 .dockerignore 文件排除无关文件,减少构建体积。
  • 选择官方/权威基础镜像,安全可靠。
  • 多阶段构建,将编译工具、源码等留在中间层,最终产物镜像足够小。
  • 环境变量、构建参数分离,提高灵活性与安全性。

四、常见问题与调试

  • 缓存未命中:频繁变动的 COPY/RUN 应靠后写,避免层失效。
  • 依赖未同步:package.json/requirements.txt 优先 COPY,锁定依赖。
  • 权限问题:容器内外用户/组不一致,注意文件属主。
  • 端口未暴露:EXPOSE 为文档作用,需 -p 映射到主机端口。

五、参考资料

  • Dockerfile 官方文档
  • Docker官方镜像仓库 Docker Hub
  • Dockerfile 最佳实践
http://www.lqws.cn/news/545617.html

相关文章:

  • 【Python】实现对LGBT+ rights worldwide (2025)数据集的可视化展示
  • 还在手动部署?用Jenkins+Docker+Git实现自动化CI/CD
  • 使用ant-design-vue 写个适用于web端的条件搜索栏组件,可折叠展开
  • 2025Mybatis最新教程(七)
  • 机器学习中为什么要用混合精度训练
  • 2025.6.27总结
  • HTTP协议中Connection: Keep-Alive和Keep-Alive: timeout=60, max=100的作用
  • SpringMVC系列(四)(请求处理的十个实验(下))
  • 多模态融合相机L3CAM
  • 高斯过程动态规划(GPDP)
  • 免费无广告PDFCreator:虚拟打印软件一键转 PDF/PNG/JPG
  • printf和scanf
  • 问卷调查[bell ring]
  • 全志A733、瑞芯微RK3576与联发科MTK8371场景化应用解析在物联网与智能设备快速迭代的今天,芯片作为硬件核心直接决定了设备的性能边界与应用场景。
  • moduo之tcp客户端TcpClient
  • Webpack 自定义插件开发指南:构建流程详解与实战开发全攻略
  • Html5播放器禁止拖动播放器进度条(教学场景)
  • 神经网络的概念和案例
  • FrozenBatchNorm2d 详解
  • 聚铭网络入选嘶吼《中国网络安全细分领域产品名录》“云平台安全管理”与“态势感知”双领域TOP10
  • Linux tcp_info:监控TCP连接的秘密武器
  • CatBoost:征服类别型特征的梯度提升王者
  • 蓝牙工作频段与跳频扩频技术(FHSS)详解:面试高频考点与真题解析
  • System.Threading.Tasks 库简介
  • ubuntu ollama 遇到的若干问题
  • Linux命令行操作基础
  • WPF 3D 开发全攻略:实现3D模型创建、旋转、平移、缩放
  • 记录一个C#/.NET的HTTP工具类
  • Feign 实战指南:从 REST 替代到性能优化与最佳实践
  • 文法、正规式相关习题