docker-compose 每次集合删除时都恢复 mongo 数据库

时间:2021-06-10 01:44:10

标签: mongodb docker docker-compose dockerfile

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

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,您希望在每次应用启动时将 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