在 Apple 芯片的 Mac 上给 x86 服务器做镜像
问题
Apple 芯片的 Mac 是 arm64 架构,云服务器大多是 x86_64(也叫 amd64)。在 Mac 上直接
docker build 出来的镜像是 arm64 的,放到服务器上一跑就报:
exec format error
意思是这个程序的指令集服务器的 CPU 看不懂。
构建时指定平台
docker buildx build --platform linux/amd64 -t myapp:1 --load .
-
--platform linux/amd64:按服务器的架构来构建。Docker Desktop 会用模拟器跑 x86 指令,所以比平时慢不少。 --load:构建完放进本机的镜像列表,后面才能导出。
构建完确认一下架构:
docker image inspect myapp:1 --format '{{.Architecture}}'
# 应该输出 amd64
不用镜像仓库,直接传到服务器
个人项目没必要为了传一个镜像去开镜像仓库。docker save
把镜像打成一个包,从管道里经过 ssh 直接交给服务器上的 docker load:
docker save myapp:1 | gzip | ssh myserver 'gunzip | docker load'
中间不落地成文件,传完服务器上 docker images 就能看到。
踩过的坑
-
依赖要在镜像里装,别把 Mac 上的
node_modules拷进去。有些依赖带编译好的本地程序(比如图片处理、加密相关的包),Mac 上装的是 arm64 版,到服务器上用不了。在.dockerignore里写上node_modules。 - 小内存的服务器上别直接构建,装依赖、编译时内存一冲高,容易把同一台机器上正在跑的服务挤掉。在本机构建好再传过去更稳。
- 镜像标签每次发布都换一个新的(比如带上版本号),服务器上留着上一个版本的镜像,出问题能马上切回去。磁盘紧张时再删老版本。