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"]
FROM - 指定基础镜像
FROM ubuntu:20.04
FROM python:3.9-slim
FROM node:14-alpine
RUN - 执行命令
RUN apt-get update && apt-get install -y curl
RUN pip install -r requirements.txt
COPY - 复制文件
COPY ./app /app
COPY requirements.txt /tmp/
ADD - 类似 COPY,但功能更多
ADD https://example.com/file.tar.gz /tmp/
ADD file.tar.gz /app/
CMD - 容器启动命令
CMD ["python", "app.py"]
CMD ["npm", "start"]
ENTRYPOINT - 入口点
ENTRYPOINT ["/app/start.sh"]
ENV - 设置环境变量
ENV APP_HOME=/app
ENV DB_HOST=mysql
ARG - 构建时变量
ARG APP_VERSION=1.0
WORKDIR - 设置工作目录
WORKDIR /app
EXPOSE - 声明端口
EXPOSE 80
EXPOSE 443
多阶段构建:减少最终镜像大小
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
最小化层数:合并 RUN 指令
RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
使用 .dockerignore:忽略不必要的文件
node_modules
.git
*.log
非 root 用户:提高安全性
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
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"]
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"]
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 示例。