Dockerfile通过文本指令定义镜像构建过程:选择轻量官方基础镜像(如node:18-alpine)、按缓存友好顺序执行COPY和RUN(先依赖后代码)、设置非root用户与WORKDIR、声明EXPOSE/ENV/ENTRYPOINT+CMD,并配合.dockerignore精简上下文。

通过 Dockerfile 将应用程序打包为镜像,核心是用文本指令描述构建过程:选择基础镜像、复制代码、安装依赖、设置运行环境、定义启动命令。写好 Dockerfile 后,用 docker build 命令即可生成可移植的镜像。
明确基础镜像和应用运行环境
基础镜像决定了操作系统、语言运行时和工具链。优先选官方轻量镜像(如 node:18-alpine、python:3.11-slim),避免使用 latest 标签,确保构建可重现。
- Node.js 应用常用
FROM node:18.17-alpine - Python 应用推荐
FROM python:3.11-slim-bookworm - Go 编译型程序可选
FROM golang:1.22-alpine AS builder多阶段构建
合理组织 COPY 和 RUN 指令顺序
Docker 构建会缓存每一层。把变动少的指令(如安装依赖)放在前面,频繁修改的(如源码)放后面,能显著提升后续构建速度。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 先
COPY package.json .再RUN npm ci --only=production(Node) - 先
COPY requirements.txt .再RUN pip install --no-cache-dir -r requirements.txt(Python) - 源码用
COPY . .放在依赖安装之后
设置非 root 用户与工作目录
安全起见,避免以 root 身份运行应用。创建普通用户并切换,同时指定清晰的工作目录。
-
WORKDIR /app统一路径,后续指令相对此目录执行 RUN addgroup -g 1001 -f app && adduser -S app -u 1001-
USER app在最后启用,确保COPY等操作仍可用 root(默认)完成
声明端口、环境变量与启动命令
让镜像行为清晰可预期:暴露监听端口、预设必要环境变量、用 ENTRYPOINT + CMD 组合支持灵活覆盖。
-
EXPOSE 3000是文档性声明,不自动映射,运行时需加-p -
ENV NODE_ENV=production或ARG DATABASE_URL(配合构建时传参) -
ENTRYPOINT ["npm", "start"]或ENTRYPOINT ["./entrypoint.sh"],CMD 留空或设默认参数
写完 Dockerfile 后,在项目根目录执行 docker build -t my-app . 即可构建。镜像生成后,用 docker run -p 3000:3000 my-app 验证是否正常启动。不复杂但容易忽略细节,比如 .dockerignore 文件排除 node_modules、git 目录等,能减小镜像体积并加快构建。

















