如何通过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,把原始迁移目录重命名:
- 在
app的Dockerfile中添加:
RUN mv /app/pb_migrations /app/pb_migrations.orig
- 修改
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
相关产品推荐
相关产品推荐

