你好、Docker
首页
Docker命令大全
Dockerfile
DockerCompose
  • Docker部署Vue项目指南
  • Docker部署Nginx指南
  • Docker部署Django项目指南
  • Docker部署fastapi项目指南
笔记
首页
Docker命令大全
Dockerfile
DockerCompose
  • Docker部署Vue项目指南
  • Docker部署Nginx指南
  • Docker部署Django项目指南
  • Docker部署fastapi项目指南
笔记
  • Dockerfile详解

Dockerfile 详解

什么是Dockerfile

Dockerfile是一个文本文件,包含了一系列指令和参数,用于自动化构建Docker镜像。通过Dockerfile,我们可以定义镜像的内容和构建过程。

基本语法

Dockerfile使用特定的指令来定义镜像的构建步骤。每条指令都会在镜像中创建一个新的层。

常用指令

FROM

  • 语法:FROM <image>[:<tag>]
  • 描述:指定基础镜像,必须是Dockerfile中的第一条指令
  • 示例:
FROM ubuntu:20.04

WORKDIR

  • 语法:WORKDIR <path>
  • 描述:设置工作目录
  • 示例:
WORKDIR /app

COPY

  • 语法:COPY <src> <dest>
  • 描述:将文件或目录从构建上下文复制到镜像中
  • 示例:
COPY . /app

ADD

  • 语法:ADD <src> <dest>
  • 描述:类似COPY,但支持URL和自动解压tar文件
  • 示例:
ADD https://example.com/file.tar.gz /app/

RUN

  • 语法:RUN <command>
  • 描述:在构建过程中执行命令
  • 示例:
RUN apt-get update && apt-get install -y nodejs

ENV

  • 语法:ENV <key>=<value>
  • 描述:设置环境变量
  • 示例:
ENV NODE_ENV=production

EXPOSE

  • 语法:EXPOSE <port>
  • 描述:声明容器运行时监听的端口
  • 示例:
EXPOSE 80

CMD

  • 语法:CMD ["executable","param1","param2"]
  • 描述:指定容器启动时执行的命令
  • 示例:
CMD ["node", "app.js"]

ENTRYPOINT

  • 语法:ENTRYPOINT ["executable", "param1", "param2"]
  • 描述:设置容器启动时执行的主程序
  • 示例:
ENTRYPOINT ["nginx", "-g", "daemon off;"]

最佳实践

  1. 使用多阶段构建
# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
  1. 合并RUN指令
# 好的做法
RUN apt-get update && \
    apt-get install -y \
    nodejs \
    npm

# 避免这样
RUN apt-get update
RUN apt-get install -y nodejs
RUN apt-get install -y npm
  1. 使用.dockerignore文件
node_modules
.git
*.log
  1. 设置适当的用户
RUN groupadd -r app && useradd -r -g app app
USER app
  1. 使用具体的标签版本
# 好的做法
FROM node:14.17.0

# 避免这样
FROM node:latest

注意事项

  1. 每个RUN指令都会创建新的层,应该合理组合命令以减少层数
  2. 在生产环境中应该使用多阶段构建来减小最终镜像的大小
  3. 合理使用缓存机制,将不经常变化的层放在前面
  4. 及时清理不需要的文件,特别是在RUN指令中
  5. 使用.dockerignore文件排除不需要的文件和目录
最近更新:: 2025/3/25 13:32
Contributors: YAOBIN