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

Dim*_*iwa 5 backup cron crontab docker

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

要对其进行配置,您可以gitlab.rb通过将其挂载为卷来覆盖调用的文件./gitlab.rb:/etc/gitlab/gitlab.rb:ro

你可以在这里找到gitlab.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
Run Code Online (Sandbox Code Playgroud)

如果您在代码中看到推荐的链接,则说:

# 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
Run Code Online (Sandbox Code Playgroud)

问题

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

L0j*_*j1k 9

所以,BigDong ...使用Docker意味着你不会有一个可用于在容器中运行crons的init系统.这是因为在CMDDockerfile指令(或ENTRYPOINT)中指定的任何命令将在容器内作为PID1运行.这就是你不能service myservice start或类似的原因.

这里的"最佳实践"是在新的gitlab-ce容器中运行备份实用程序.这意味着您将用于docker run创建一个"备份"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容器)以访问容器中的数据卷(如果有).但是,由于您专门使用S3进行备份存储(如配置中所定义),因此您无需担心处理卷.我只是将其包括在内以便澄清,因为使用卷是一种非常常见的情况.

您可以从中发现正在发生的事情,但对于那些不能发生的事情,您正在运行gitlab-ce 映像以启动一个只运行单个命令来执行备份的新容器.实际上,它sh -c以您的gitlab-rake备份实用程序及其参数作为参数运行.然后,您将crontab -e主机上使用每天凌晨两点在主机设置的任何时区运行此命令:

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

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

这里要考虑的另一个选择是将gitlab-ce容器的数据挂载到主机上的绑定挂载卷中,然后您可以对来自主机的数据进行操作.但是,我想在这里我强烈建议您使用应用程序提供的任何备份基础结构.在这种情况下,gitlab-rake实用程序.

如果由于某种原因这不具吸引力,另一种选择是创建一个使用docker rundocker exec在其他容器中运行任务的cron 容器.

关于你备份Gitlab的特定需求......另一个需要考虑的选择就是这个Gitlab docker镜像.它内置了在某个特定时间点运行备份的能力,也是我个人用于自动备份的功能.看起来新版本允许您直接备份到S3,而不是在主机上运行cron以转移到S3.在这种情况下,如果docker镜像专门提供了不使用外部资源进行备份的功能,那么这样做就可以了.从广义上讲,关注点分离(备份是一个单独的问题),您不应该将这些功能组合到一个容器中.人们的本能是将尽可能多地放入容器中,但你会发现Docker最适合作为微服务提供者.

主要的是Docker在完成任务方面为您提供了很多选择.它的部分功能在于通常有多种方法可以完成单个任务,因此您需要确定哪种方法最适合您的情况.祝好运!

tl; dr用于docker run启动由主机上运行的cronjob触发的提供的gitlab-ce备份实用程序(gitlab-rake).


小智 9

根据Gitlab Doku的说法,您可以使用" docker run"方法,而不仅仅是:

docker exec -t <your container name> gitlab-rake gitlab:backup:create
Run Code Online (Sandbox Code Playgroud)