一、起因

云服务器的内存太小了,而next.js的编译又是内存大户,所以笔者就想能不能在我本地电脑上直接编译好了传到服务器上直接docker compose up -d,于是找到了支持交叉编译的buildx工具。

二、在Mac上安装和配置Docker和colima

2.1 安装

brew install docker
brew install colima

2.2 配置colima

colima start --edit

可以分配多一点CPU和内存

# Number of CPUs to be allocated to the virtual machine.
# Default: 2
cpu: 8
​
# Size of the disk in GiB to be allocated to the virtual machine for container data.
# NOTE: value can only be increased after virtual machine has been created.
#
# Default: 100
disk: 100
​
# Size of the memory in GiB to be allocated to the virtual machine.
# Default: 2
memory: 6

在下面配置一个换源路径

docker:
  registry-mirrors:
    - https://mirror.ccs.tencentyun.com
    - https://docker.m.daocloud.io

但配置这个换源路径还不够,还需要编辑~/.docker/buildkitd.toml文件,不然docker buildx还是无法拉取node24这样的包

[registry."docker.io"]
  mirrors = ["docker.m.daocloud.io"]

2.3 让 buildx 加载这个配置并创建容器

docker buildx create --name mybuilder --config ~/.docker/buildkitd.toml --use 
docker buildx inspect --bootstrap

三、使用阿里云容器镜像服务控制台

网站:https://cr.console.aliyun.com/cn-chengdu/instances

  1. 创建个人实例-命名空间

  2. 在这个命名空间创建两个仓库(因为我的next项目分了两个应用)

四、进行构建和推送

4.1 创建.dockerignore文件

首先需要在项目内添加一个.dockerignore文件来过滤掉所有本地编译产物和垃圾文件

.git
.gitignore
node_modules
.next
out
build
.build
apple/**/.build
*.log
.DS_Store

4.2 进行推送

# 先在终端登录
docker login --username=your_name your_web
​
# 构建和推送
docker buildx build \
  --platform linux/amd64 \
  --target runner \
  -t my_space_addr/workenote-app:latest \
  --push .
​
docker buildx build \
  --platform linux/amd64 \
  --target worker \
  -t my_space_addr/worknote-worker:latest \
  --push .

五、在服务器端拉取与部署

5.1 拉取

# 1.先登录
docker login --username=your_name your_web
​
# 2.拉
docker pull my_space_addr:latest

5.2 部署

  1. 首先需要把项目里必要的环境文件和配置文件移植过来(包括.env,以及笔者自己项目的llm.yml

  2. 配置docker-compose.yml

    services:
      worknote-app:
        image: my-space-addr/workenote-app:latest
        container_name: worknote-app
        restart: unless-stopped
        command: ["node", "server.js"]
        ports:
          - "3005:3005"
        env_file:
          - .env
        environment:
          PORT: "3005"
        volumes:
          - ./config:/app/config
    ​
      worknote-worker:
        image: my-space-addr/worknote-worker:latest
        container_name: worknote-worker
        restart: unless-stopped
        command: ["npm", "run", "worker:weekly-reports"]
        env_file:
          - .env
        volumes:
          - ./config:/app/config:ro
  1. 输入docker compose up -d即可部署