插件窝 干货文章 dockerfile怎么写

dockerfile怎么写

Dockerfile APP COPY RUN 378    来源:    2025-04-08

Dockerfile 编写指南

Dockerfile 是一个文本文件,包含了一系列指令,用于自动化构建 Docker 镜像。以下是一个完整的 Dockerfile 编写指南:

基本结构

# 基础镜像
FROM base_image:tag

# 维护者信息 (已废弃,推荐使用 LABEL)
# MAINTAINER name@example.com

# 设置元数据
LABEL maintainer="name@example.com"
LABEL version="1.0"
LABEL description="This is a custom Docker image"

# 设置环境变量
ENV NODE_ENV production
ENV APP_PORT 3000

# 安装依赖和工具
RUN apt-get update && apt-get install -y \
    package1 \
    package2 \
    && rm -rf /var/lib/apt/lists/*

# 创建工作目录
WORKDIR /app

# 复制文件到容器中
COPY . .

# 或者使用 ADD (会自动解压tar文件)
# ADD source.tar.gz /app

# 暴露端口
EXPOSE 3000

# 定义挂载点
VOLUME ["/data"]

# 设置容器启动时执行的命令
CMD ["npm", "start"]

# 或者使用 ENTRYPOINT
# ENTRYPOINT ["npm"]
# CMD ["start"]

常用指令详解

  1. FROM - 指定基础镜像

    FROM ubuntu:20.04
    FROM python:3.9-slim
    FROM node:14-alpine
    
  2. RUN - 执行命令

    RUN apt-get update && apt-get install -y curl
    RUN pip install -r requirements.txt
    
  3. COPY - 复制文件

    COPY ./app /app
    COPY requirements.txt /tmp/
    
  4. ADD - 类似 COPY,但功能更多

    ADD https://example.com/file.tar.gz /tmp/
    ADD file.tar.gz /app/
    
  5. CMD - 容器启动命令

    CMD ["python", "app.py"]
    CMD ["npm", "start"]
    
  6. ENTRYPOINT - 入口点

    ENTRYPOINT ["/app/start.sh"]
    
  7. ENV - 设置环境变量

    ENV APP_HOME=/app
    ENV DB_HOST=mysql
    
  8. ARG - 构建时变量

    ARG APP_VERSION=1.0
    
  9. WORKDIR - 设置工作目录

    WORKDIR /app
    
  10. EXPOSE - 声明端口

    EXPOSE 80
    EXPOSE 443
    

最佳实践

  1. 使用官方镜像:优先使用官方维护的基础镜像
  2. 多阶段构建:减少最终镜像大小

    FROM node:14 as builder
    WORKDIR /app
    COPY . .
    RUN npm install && npm run build
    
    FROM nginx:alpine
    COPY --from=builder /app/dist /usr/share/nginx/html
    
  3. 最小化层数:合并 RUN 指令

    RUN apt-get update && apt-get install -y \
       package1 \
       package2 \
       && rm -rf /var/lib/apt/lists/*
    
  4. 使用 .dockerignore:忽略不必要的文件

    node_modules
    .git
    *.log
    
  5. 非 root 用户:提高安全性

    RUN groupadd -r appuser && useradd -r -g appuser appuser
    USER appuser
    

示例 Dockerfile

Python 应用示例

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV FLASK_APP=app.py
ENV FLASK_ENV=production

EXPOSE 5000

CMD ["flask", "run", "--host", "0.0.0.0"]

Node.js 应用示例

FROM node:14-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install --production

COPY . .

ENV NODE_ENV=production
ENV PORT=3000

EXPOSE 3000

CMD ["node", "server.js"]

Java Spring Boot 示例

FROM openjdk:11-jre-slim

ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

构建和运行

构建镜像:

docker build -t my-app:1.0 .

运行容器:

docker run -d -p 4000:3000 --name my-app-container my-app:1.0

希望这个指南能帮助你编写 Dockerfile!如果有特定应用场景的需求,可以提供更多细节,我可以给出更具体的 Dockerfile 示例。