Dockerfile 是构建 Docker 镜像的脚本文件,包含了一系列指令来定义如何构建镜像。下面我将详细介绍如何使用 Dockerfile 创建自定义镜像。
一个典型的 Dockerfile 包含以下部分: - 基础镜像 (FROM) - 维护者信息 (LABEL) - 镜像操作指令 (RUN, COPY, ADD 等) - 容器启动时执行的命令 (CMD, ENTRYPOINT)
# 指定基础镜像
FROM ubuntu:20.04
# 维护者信息
LABEL maintainer="yourname@example.com"
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive
# 更新软件包列表并安装必要软件
RUN apt-get update && \
apt-get install -y \
nginx \
curl \
&& rm -rf /var/lib/apt/lists/*
# 复制本地文件到镜像中
COPY index.html /var/www/html/
# 暴露端口
EXPOSE 80
# 容器启动时运行的命令
CMD ["nginx", "-g", "daemon off;"]
FROM - 指定基础镜像
FROM ubuntu:20.04
RUN - 执行命令
RUN apt-get update && apt-get install -y package
COPY - 复制文件
COPY ./local/path /container/path
ADD - 类似 COPY,但功能更多(可解压tar包,可从URL下载)
ADD http://example.com/file.tar.gz /tmp/
CMD - 容器启动时执行的命令
CMD ["executable", "param1", "param2"]
ENTRYPOINT - 类似CMD,但不会被docker run参数覆盖
ENTRYPOINT ["executable", "param1", "param2"]
ENV - 设置环境变量
ENV PATH /usr/local/bin:$PATH
ARG - 构建时变量
ARG version=1.0
EXPOSE - 声明暴露的端口
EXPOSE 80
WORKDIR - 设置工作目录
WORKDIR /app
USER - 指定运行用户
USER nobody
VOLUME - 创建挂载点
VOLUME /data
docker build -t my-image:1.0 .
-t
指定镜像名称和标签.
表示使用当前目录下的 DockerfileDocker 构建时会将当前目录(构建上下文)发送给 Docker 守护进程,因此建议:
- 使用 .dockerignore
文件排除不需要的文件
- 将 Dockerfile 放在专门目录中,避免发送过多文件
对于需要编译的应用,可以使用多阶段构建减少最终镜像大小:
# 第一阶段:构建应用
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 第二阶段:运行应用
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
使用官方镜像:尽量使用官方镜像作为基础镜像
减少层数:合并 RUN 指令减少镜像层数
RUN apt-get update && \
apt-get install -y package1 package2 && \
rm -rf /var/lib/apt/lists/*
清理缓存:安装软件后清理 apt/yum 缓存
使用特定标签:避免使用 latest 标签
FROM ubuntu:20.04
最小化镜像:使用 alpine 等轻量级基础镜像
非root用户:使用非 root 用户运行应用
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
健康检查:添加 HEALTHCHECK 指令
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
标签信息:使用 LABEL 添加元数据
LABEL version="1.0" \
description="My custom image"
构建缓存:
--no-cache
禁用缓存:docker build --no-cache -t my-image .
# nocache
检查构建过程:
docker history my-image
交互式调试:
docker run -it --rm --entrypoint /bin/bash my-image
分析镜像:
docker inspect my-image
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 ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
FROM node:14-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
通过掌握这些 Dockerfile 知识,您应该能够创建高效、安全的 Docker 镜像来满足各种应用场景的需求。