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

How to enable cron backup in docker gitlab-ce

我正在使用 this Docker 映像来安装 gitlab-ce

要配置它,您可以覆盖名为 gitlab.rb 的文件,方法是将其作为卷安装在 ./gitlab.rb:/etc/gitlab/gitlab.rb:ro

你可以找到gitlab.rbhere

在备份部分,我目前有这个:

## 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

如果您按照代码中的建议看到此 link,它会显示:

# 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

问题

所以,BigDong...使用 Docker 意味着您不会有一个初始化系统可用于容器中的 运行 crons。这是因为 CMD Docker 文件指令(或 ENTRYPOINT)中指定的任何命令都将作为容器内的 PID1 运行。这就是为什么你不能 service myservice start 或类似的原因。

此处的 "best practice" 只是 运行 您在新 gitlab-ce 容器中的备份实用程序。这意味着您将使用 docker run 创建一个 "backup" gitlab-ce 映像,您 运行 在某些情况下由主机上的 cron 触发。然后你的备份命令实际上会在你的 docker run 命令中。这听起来令人困惑,所以让我举例说明。像这样:

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

如果您在容器中使用数据卷来持久化数据(或通过绑定挂载存储在主机上的特定目录),您应该将其更改为:

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

"backup" gitlab-ce 镜像使用 --volumes-from gitlab-ce(或者你的 gitlab-ce 容器的任何名称)来访问容器中的数据卷(如果有的话)。 但是 因为您专门使用 S3 进行备份存储,如您的配置中所定义,您无需担心处理卷。我只是将此包括在内以作澄清,因为使用卷的情况比不使用要普遍得多。

您可能可以从中了解发生了什么,但对于那些不能做到的读者,您 运行按顺序 gitlab-ce image启动一个新的 容器,它只是 运行 执行备份的单个命令。实际上,它是 运行ning 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 实用程序。

另一种选择,如果出于某种原因这没有吸引力,将创建一个 cron 容器,该容器使用 docker rundocker exec 来 运行 您在其他容器中的任务。

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

最主要的是 Docker 在完成任务方面为您提供了很多选择。它的部分优势在于通常有多种方法可以完成一项任务,因此您可以自行决定哪种方法最适合您的情况。祝你好运!

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

除了 "docker run" 方法,您还可以根据 Gitlab Doku,简单地发出:

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

我使用以下 解决方法 通过 go-crond 实现了自动备份,它与综合图像一起提供:

我正在设置这两个环境变量:

BACKUP_CRONTAB = <<-EOF
  SHELL=/bin/bash
  0 2 * * * root gitlab-backup create # Daily at 2am (UTC)
  EOF
GITLAB_POST_RECONFIGURE_SCRIPT = <<-EOF
  echo "$BACKUP_CRONTAB" > "/backup-crontab"
  go-crond "/backup-crontab" &
  EOF

GITLAB_POST_RECONFIGURE_SCRIPT中的脚本在启动时自动执行并启动备份调度。

这当然只是一种解决方法。 This GitLab issue 跟踪正确解决方案的实施。