应先复制package.json并安装依赖,再复制源码;用.dockerignore排除node_modules等冗余文件;换国内镜像源加速下载;采用多阶段构建分离编译与运行环境。

把依赖安装提前,让缓存更稳
Docker 构建缓存是逐层生效的:只要某一层变了,它后面所有层都会重新执行。很多团队把 COPY . /app 放在最前面,结果改一行代码,连 pip install 或 npm install 都得重跑一遍。
正确做法是分三步走:
- 先 COPY requirements.txt(或 package.json)这类变动极少的文件
- 紧接着 RUN pip install -r requirements.txt(或 npm install),这层一旦成功,后续只要依赖没变,就永远复用
- 最后才 COPY . . 整个源码目录,这样只有业务代码改了,才影响这一层
用 .dockerignore 减少上下文干扰
执行 docker build 时,整个构建上下文(当前目录及子目录)都会打包传给 Docker 守护进程。如果里面混着 node_modules、.git、日志或大文件,不仅传输慢,还会让 COPY 指令因文件哈希变化而意外失效。
在项目根目录加一个 .dockerignore 文件,至少包含:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- node_modules
- .git
- *.log
- logs/
- data/(如有测试数据集)
换国内镜像源,加速依赖下载
RUN 指令里下载依赖卡住,大概率不是网络问题,而是默认源在国外。不同语言有对应优化方式:
- Python:pip install 加 -i https://pypi.tuna.tsinghua.edu.cn/simple
- Node.js:构建前设环境变量 NPM_CONFIG_REGISTRY=https://registry.npmmirror.com
- Debian/Ubuntu:RUN 替换 /etc/apt/sources.list 为阿里云或清华源
按需启用多阶段构建
开发依赖(比如 webpack、TypeScript 编译器)不该进生产镜像。单阶段构建会把它们全塞进去,既增大体积,又让缓存更难命中——因为 devDependencies 变动也会触发重构建。
用多阶段分离编译和运行:
- 第一阶段用完整镜像(如 node:18)做构建,装全部依赖、执行 build 命令
- 第二阶段用轻量镜像(如 node:18-alpine)只复制 dist/ 和 node_modules/ 中 runtime 所需部分
- 最终镜像不带任何构建工具,体积小、启动快、缓存更干净










