首页 > 解决方案 > 每次删除集合时,docker-compose 恢复 mongo 数据库

问题描述

我希望能够重新创建一些在删除和docker-compose up调用 mongo-data 文件夹时转储的基本数据。我面临的问题是应用程序没有mongo

这些是我的文件:docker-compose.yml

version: "3"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/testapp
    environment:
      DB_URL: mongodb://test_mongo/appdb
    depends_on:
      - mongo

  mongo:
    image: "mongo:4.4.4"
    restart: always
    container_name: test_mongo
    ports:
      - "27017:27017"
      - "27018:27018"
    volumes:
      - ./mongo-data:/data/db

Dockerfile:

FROM node:14.15.5

RUN mkdir -p /testapp
WORKDIR /testapp

EXPOSE 3000

ENTRYPOINT ["./entrypoint.sh"]

入口点.sh:

#!/bin/bash

sh ./__backup__/db/restore.sh
sh ./__backup__/app/restore.sh

yarn install
yarn start:dev

备份/app/restore.sh:

#!/bin/bash

if [[ ! -d '/testapp/uploads' ]]
then
  tar -xvf ./uploads.tar.gz /testapp/
fi

备份/app/restore.sh:

#!/bin/bash

until mongo --eval "print(\"waited for connection\")"
do
    sleep 1
done

if [[ ! -d '/testapp/mongo-data' ]]
then
    mongorestore --archive ./db.dump
fi

在mongo服务启动或从应用程序运行mongo之后,是否有运行这些resotre.sh文件?

标签: mongodbdockerdocker-composedockerfile

解决方案


如果我正确理解了这个问题,您希望每次启动应用程序时都将 MongoDB 恢复到某个状态,并且您会询问在 MongoDB 容器启动后是否有办法做到这一点。

有一个名为docker-compose-wait的工具,引用自其 GitHub README,它是一个小型命令行实用程序,用于在使用 docker-compose 时等待其他 docker 映像启动。

使用它相当简单。将其添加到映像中,运行/wait以等待服务启动,然后继续下一步。

因此,根据您当前的设置,您的 Dockerfile 可能是这样的:

FROM node:14.15.5

## Add the wait script to the image
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait /wait
RUN chmod +x /wait

RUN mkdir -p /testapp
WORKDIR /testapp

ADD . .

EXPOSE 3000

## Launch the wait tool and then your entrypoint.sh
ENTRYPOINT /wait && /testapp/entrypoint.sh"

entrypoint.sh已经在其中编写了调用恢复脚本。在您的 docker-compose.yml 中,添加环境变量以设置要等待的服务。

version: "3"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/testapp
    environment:
      DB_URL: mongodb://test_mongo/appdb
      WAIT_HOSTS: mongo:27017
    depends_on:
      - mongo

  mongo:
    image: "mongo:4.4.4"
    restart: always
    container_name: test_mongo
    ports:
      - "27017:27017"
      - "27018:27018"
    volumes:
      - ./mongo-data:/data/db

推荐阅读