如何在docker gitlab-ce中启用cron备份

我正在使用这个 Docker镜像来安装gitlab-ce

要configuration它,可以通过在./gitlab.rb:/etc/gitlab/gitlab.rb:ro处将其挂载为卷来覆盖名为gitlab.rb的文件

你可以在这里findgitlab.rb

在备份部分我目前有这样的:

 ## For setting up backups ## see https://gitlab.com/gitlab-org/omnibus-gitlab/blob/629def0a7a26e7c2326566f0758d4a27857b52a3/README.md#backups # gitlab_rails['manage_backup_path'] = true # gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_archive_permissions'] = 0644 # See: http://doc.gitlab.com/ce/raketasks/backup_restore.html#backup-archive-permissions # gitlab_rails['backup_pg_schema'] = 'public' gitlab_rails['backup_keep_time'] = 604800 # gitlab_rails['backup_upload_connection'] = { # 'provider' => 'AWS', # 'region' => 'eu-west-1', # 'aws_access_key_id' => 'AKIAKIAKI', # 'aws_secret_access_key' => 'secret123' # } # gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket' # gitlab_rails['backup_multipart_chunk_size'] = 104857600 # gitlab_rails['backup_encryption'] = 'AES256' # Turns on AWS Server-Side Encryption with Amazon S3-Managed Keys for backups 

如果你看到这个链接的代码build议,它说:

 # Scheduling a backup To schedule a cron job that backs up your repositories and GitLab metadata, use the root user: sudo su - crontab -e There, add the following line to schedule the backup for everyday at 2 AM: 0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create 

问题

  • 有没有办法做到这一点在安装而不是手动?
  • cron任务已经在运行? 我们不应该通过执行crontab -f启动它吗?
  • 什么文件的命令crontab -e修改?
  • 要更改教程的手动configuration部分,使用像/etc/cron.d/my-backup-cron这样的cron文件是否会有相同的预期行为?

所以,BigDong …使用Docker意味着你不会有一个可用的init系统在容器中运行cron。 这是因为在CMD Dockerfile指令(或ENTRYPOINT )中指定的任何命令都将在您的容器中作为PID1运行。 这就是为什么你不能为我的service myservice start或类似service myservice start

这里的“最佳实践”就是在新的gitlab-ce容器中运行备份工具。 这意味着你将使用docker docker run创build一个“备份”gitlab-ce镜像,你在主机上通过cron触发的某种情况下运行。 那么你的备份命令实际上就在你的docker run命令中。 这听起来很混乱,所以让我来说明一下。 像这样的东西:

docker run -d --rm gitlab-ce sh -c "/opt/gitlab/bin/gitlab-rake gitlab:backup:create"

如果您正在容器中使用数据卷来保存数据(或通过bind-mount存储在主机上的特定目录中),则应该将其更改为:

docker run -d --rm --volumes-from gitlab-ce gitlab-ce sh -c "/opt/gitlab/bin/gitlab-rake gitlab:backup:create"

“备份”gitlab-ce映像使用--volumes-from gitlab-ce (或任何你的gitlab-ce容器被调用)的-volumes来访问容器中的数据卷(如果有的话)。 但是,由于您正在使用S3来备份存储,因此您不需要担心处理卷。 我只是包括这个澄清,因为使用卷是一个更为普遍的情况比不。

你可以从这里得知正在发生的事情,但是对于那些不能的读者,你运行的是gitlab-ce 映像 ,以便启动一个只运行单个命令来执行备份的新容器 。 实际上,它使用gitlab-rake备份工具和参数作为参数运行sh -c 。 然后,你将使用主机上的crontab -e来每天早晨两点在主机设置的任何时区运行这个命令:

0 2 * * * docker run -d --rm gitlab-ce sh -c "...gitlab-rake..."

有一点很重要的是--rm选项。 这就告诉Docker删除任何创build的中间容器,这样就不会有大量孤立的备份容器在你的docker ps -a

这里要考虑的另一个select是将gitlab-ce容器的数据装载到主机上的绑定安装卷上,然后可以对主机上的数据进行操作。 不过,我想在这里我强烈build议您使用应用程序提供的任何备份基础架构。 在这种情况下, gitlab-rake实用程序。

另一个select,如果这不是因为什么原因而不吸引人的话,那就是创build一个使用docker run或者docker exec在其他容器中运行你的任务的cron容器。

关于你的具体需要备份Gitlab …另一个选项要考虑的是这个Gitlab泊坞窗图像 。 它具有在某个特定时间点运行备份的能力,这是我个人用来自动备份的function。 看起来新版本允许你直接备份到S3,而不是在主机上运行一个cron以转移到S3。 在这种情况下,如果docker镜像特别提供了在不使用外部资源的情况下进行备份的function,则可以这样做。 一般来说,关注点分离(备份是一个单独的问题),你不应该把这些function合并成一个容器。 人们的本能就是尽可能地把一个容器放进一个容器,但是你会发现Docker作为一个微服务提供者是最好的。

最主要的是Docker为您完成任务提供了很多select。 部分权力是通常有几种方法来完成一项任务,所以决定哪种方法最适合您的情况取决于您。 祝你好运!

tl; dr使用docker run启动由主机上运行的cronjob触发的提供的gitlab-ce备份工具(gitlab-rake)。

根据Gitlab Doku的说法 ,代替“docker运行”的方法,您也可以简单地发出:

 docker exec -t <your container name> gitlab-rake gitlab:backup:create