❌ 错误示范
一个常见的错误是在单个阶段中构建所有内容,最终导致构建的镜像中包含所有构建依赖项,特别臃肿。
FROM node:22
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
✅正确做法
使用多阶段构建将构建环境与运行时环境分开。
# Build stage
FROM node:22 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Production stage
FROM node:22-slim
WORKDIR /app
COPY
COPY
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]
选择正确的基础镜像
❌ 错误示范
FROM ubuntu:latest
RUN apt-get update && apt-get install -y python3 python3-pip
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["python3", "app.py"]
✅正确做法
选择满足您要求的最小基础镜像,查找带有 Docker Hub 官方徽章或已验证发布者标记的基础镜像,因为这些映像往往更安全且维护得更好。
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install
COPY . .
CMD ["python", "app.py"]
使用固定的镜像版本号
❌ 错误示范
不要使用像 latest
这样可能会意外更改的镜像版本。
FROM node:latest
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "index.js"]
FROM node:22.1.0
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "index.js"]
即便使用固定的基础镜像版本,由于安全更新等原因远程仓库存储的镜像也可能会发生改变,如果你不希望这种改变发生,使用哈希摘要版本号来保证镜像不变。
FROM node:22.1.0@sha256:12a331df1e31e40b2f37d2524037973908895fb766b8bce742cdf8b1216e5ac2
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "index.js"]
优化镜像层缓存
❌ 错误示范
不要将频繁变化的文件放在前面。
FROM node:22
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
✅正确做法
先拷贝包依赖管理文件,如果依赖没有变化,npm install将使用缓存而无需重新下载依赖,加速构建过程。
FROM node:22
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
正确处理apt-get和其他包管理器
❌ 错误示范
不要将 update 和 install 命令分开,此方法会缓存 apt-get update
结果,这意味着以后的构建可能会安装过时的软件包。
FROM ubuntu:24.04
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
✅正确做法
始终将 update 和 install 合并到单个
RUN
指令中。
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y
nginx \
curl \
&& rm -rf /var/lib/apt/lists
使用.dockerignore排除不必要的文件
❌ 错误示范
不要将整个项目目录作为构建上下文发送。
$ docker build -t myapp .
✅正确做法
创建.dockerignore文件排除不必要的文件,这可以减小构建上下文的大小,加快构建过程,并有助于防止敏感信息泄漏到您的镜像中。
.git
.github
.gitignore
node_modules
npm-debug.log
Dockerfile
.dockerignore
*.md
.env*
*.log
coverage
dist
build
tmp
不要为环境变量创建多个镜像层
❌ 错误示范
每个环境变量会生成一个新的镜像层。
FROM node:22
ENV NODE_ENV=production
ENV APP_PORT=3000
ENV APP_VERSION=1.2.3
FROM node:22
ENV NODE_ENV=production \
APP_PORT=3000 \
APP_VERSION=1.2.3
设置适当的用户
❌ 错误示范
直接以root用户运行。
FROM nginx:alpine
COPY app/ /usr/share/nginx/html
# Implicitly runs as root
CMD ["nginx", "-g", "daemon off;"]
FROM nginx:alpine
RUN addgroup -g 1000 appgroup && \
adduser -u 1000 -G appgroup -h /home/appuser -D appuser
COPY --chown=appuser:appgroup app/ /usr/share/nginx/html
USER appuser
CMD ["nginx", "-g", "daemon off;"]
使用WORKDIR而不是RUN cd
❌ 错误示范
这种方法易出错,难阅读。
FROM node:22
RUN cd /opt && mkdir app
RUN cd /opt/app && npm init -y
COPY . /opt/app/
RUN cd /opt/app && npm install
CMD cd /opt/app && npm start
FROM node:22
# Good practice - using WORKDIR
WORKDIR /opt/app
RUN npm init -y
COPY . .
RUN npm install
CMD ["npm", "start"]
评论 (0)