docker mongoDB实例的Mongodump转换为单个时间戳文件

我正在通过mongo_db -compose做一个mongoDb docker实例( mongo_db )的备份转储( mongo_db感谢Matt的那个片段):

  version: "3" services: mongo_db_backup: image: 'mongo:3.4' volumes: - '/backup:/backup' command: | mongodump --host mongo_db --out /backup/ --db specific 

执行命令

 $ docker-compose run mongo_db_backup 

给我所有的specific数据库的集合,并将它们存储在/backup/specific

是否有可能只获得一个单一的(压缩)转储文件,这是命名为当前时间?

我正在使用--out来获取文件夹中的文件。 文档说我不能使用--archive--out一起--out

进一步我需要使用一个envvariables来设置归档输出。 像这样的东西:

 mongo_db_backup: image: 'mongo:3.4' volumes: - '/backup:/backup' command: - sh - -c - | mongodump --host mongo_db --gzip --db specific $$( if [ $TYPE = "hour" ] then echo "--archive=/backup/hour/$$(date +"%H").gz" elif [ $TYPE = "day" ] then echo --archive=/backup/day/$$(date +"%d").gz fi ) 

执行$ docker-compose run -e TYPE=day mongo_db_backup

你可以改变你的写作到下面

  version: "3" services: mongo_db_backup: image: 'mongo:3.4' volumes: - '/backup:/backup' command: sh -c "mongodump --host mongo_db --gzip --archive=/backup/$$(date +'%Y%m%d_%H%M%S') --db $${DB:=specific}" 

现在,如果你想改变数据库,你可以像下面这样运行它

 docker-compose run -e DB=abc mongo_db_backup 

如果你想像docker-compose run mongo_db_backup abc那样使用它docker-compose run mongo_db_backup abc那么需要创buildentrypoint.sh脚本来处理这个参数。 所以使用环境variables做起来更容易

编辑1 – 缺less环境variables的默认行为

如果您需要根据指定的环境variables来更改命令,则可以将命令更改为以下

 command: sh -c "mongodump --host mongo_db --gzip --archive=/backup/$$(date +'%Y%m%d_%H%M%S') $$(if [ -z $DB ]; then echo '--db default_db'; else echo --collection $DB; fi)" 

编辑2:多行命令与其他if组合

要解决使用多行命令组合的问题,您需要使用数组和多行的组合

 command: - sh - -c - | multi line shell script 

以下是我为您更新而制定的命令

 command: - bash - -c - | TYPE=$${TYPE:=day} if [ ! -d /backup/hour ]; then mkdir /backup/hour; fi if [ ! -d /backup/day ]; then mkdir /backup/day; fi mongodump --host mongo_db --gzip \ --db test \ $$( \ if [ "$$TYPE" == "hour" ]; then \ echo "--archive=/backup/hour/$$(date +'%H').gz"; \ elif [ "$$TYPE" == "day" ]; then \ echo "--archive=/backup/day/$$(date +'%d').gz"; \ fi \ ) 

由于docker-compose处理variables,我们需要使用$$转义每个$ 。 所以$TYPE变成$$TYPE 。 另外mongodump是一个单一的命令,所以如果你把它分成多行,你需要使用\用于多行命令的延续