我希望能够重新创建一些在删除 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 文件?
答案 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