You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker Compose将Node.js容器目录共享给PocketBase容器?

问题原因

你当前的配置里,命名卷pb_migrations初始状态是空的。当把它挂载到app容器的/app/pb_migrations时,Docker会用卷的空内容覆盖容器镜像里原本存在的/app/pb_migrations目录,导致卷里始终没有迁移文件,pocketbase容器自然也拿不到数据。

解决方案

以下两种方案都能在不手动复制目录或主机挂载的前提下,仅通过docker-compose.yml配置实现需求:

方案一:用初始化容器同步迁移文件

新增一个初始化容器,基于你的app:latest镜像,提前把镜像内的迁移文件复制到命名卷中,确保pocketbase和app容器启动时能读取到数据:

version: '3.7'
services:
  pocketbase:
    image: spectado/pocketbase:0.19.2
    container_name: pocketbase
    restart: unless-stopped
    ports:
      - '8090:80'
    volumes:
      - pb_data:/pb_data
      - pb_migrations:/pb_migrations/
    depends_on:
      - init_migrations

  app:
    image: app:latest
    container_name: app
    restart: unless-stopped
    env_file: .env
    volumes:
      - pb_migrations:/app/pb_migrations/
    ports:
      - '$PORT:$PORT'
    depends_on:
      - pocketbase
      - init_migrations

  init_migrations:
    image: app:latest
    volumes:
      - pb_migrations:/migrations_target/
    command: sh -c "cp -r /app/pb_migrations/* /migrations_target/"
    restart: "no"

volumes:
  pb_data:
  pb_migrations:

初始化容器会优先启动,把app镜像内/app/pb_migrations的所有文件复制到命名卷pb_migrations中,后续两个业务容器挂载该卷时就能获取到迁移文件。

方案二:修改应用容器启动命令同步数据

如果不想新增容器,可以调整app容器的启动命令,先把镜像内的迁移文件复制到挂载卷目录,再启动Node应用。不过需要先修改你的app镜像Dockerfile,把原始迁移目录重命名:

  1. 在app的Dockerfile中添加:
RUN mv /app/pb_migrations /app/pb_migrations.orig
  1. 修改docker-compose.yml:
version: '3.7'
services:
  pocketbase:
    image: spectado/pocketbase:0.19.2
    container_name: pocketbase
    restart: unless-stopped
    ports:
      - '8090:80'
    volumes:
      - pb_data:/pb_data
      - pb_migrations:/pb_migrations/
    depends_on:
      - app

  app:
    image: app:latest
    container_name: app
    restart: unless-stopped
    env_file: .env
    volumes:
      - pb_migrations:/app/pb_migrations/
    ports:
      - '$PORT:$PORT'
    command: sh -c "cp -r /app/pb_migrations.orig/* /app/pb_migrations/ && npm start"

volumes:
  pb_data:
  pb_migrations:

启动时app容器会先把重命名后的原始迁移文件复制到挂载卷目录,再启动应用,这样pocketbase容器挂载的卷中就会有迁移文件。

内容的提问来源于stack exchange,提问作者OhSnap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:23:14