2017-09-27 39 views
0

我通过搬运工,撰写做了MongoDB的泊坞窗实例(mongo_db)的备份转储(感谢马特该片段至今):泊坞窗Mongodump MongoDB实例单时间戳命名的文件

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一起。

此外我需要使用env变量来设置归档输出。事情是这样的:

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

+0

尝试改变命令'SH -c“mongodump --host mongo_db --gzip --archive = /备份/ $$(日期+“%Y%m%d_%H%M%S”) - db specific“' –

+0

我需要”|“吗? – user3142695

+0

只有你把它放在下一行。如果您使用'命令:'那么它不需要 –

回答

1

执行您可以撰写改变以下

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那么将需要创建entrypoint.sh脚本处理该参数。所以它更容易使用环境变量

编辑-1做到这一点 - 在缺少环境变量

如果您需要根据被指定与否环境变量来改变命令默认行为,您可以更改命令到低于

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:在撰写多行线命令如果别的

为了解决在撰写使用多命令的问题,您需要使用阵列和多

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 \ 
    ) 

由于码头工人,撰写过程变量的命令,我们需要使用$$逃避每个$。所以$TYPE变成$$TYPE。此外mongodump是一个命令,所以如果你把它分解成多行,你需要使用\多行命令连续

+0

完美。如果env变量没有设置会发生什么?将使用它来设置特定的集合(而不是数据库)。如果env变量没有设置集合,那么应该完成一次转储... – user3142695

+0

不,我添加它为数据库名称采用默认值'specific'。如果你需要做这些事情,那么最好的办法是转储脚本,可以处理这种情况 –

+0

你能告诉我一个这样的转储脚本的小例子吗?只能设置--collection选项。那真是太棒了! – user3142695