Windows上GitLab docker镜像的卷问题

时间:2017-06-21 19:21:58

标签: windows docker gitlab

我正试图在我的Windows 10上使用docker运行官方图片 gitlab / gitlab-ce:latest 第一次我尝试像下面一样运行它并且有效。

  

docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 8080:80 --publish 22:22 \\   --name gitlab \
   - 再次总是\\   --volume / srv / gitlab / config:/ etc / gitlab \
  --volume / srv / gitlab / logs:/ var / log / gitlab \
  --volume / srv / gitlab / data:/ var / opt / gitlab \
  gitlab / gitlab-CE:最新

问题,容器中的更改未保存。我发现事情已经完成了。此附件仅适用于Boot2Docker VM。好的,我成功地在docker设置(桌面应用程序)中从主机(Window)共享了我的磁盘C:/并进行了测试。 Window的文件夹共享,我可以在测试容器中看到文件。

现在我正在尝试像这样运行gitlab图像:

  

docker run --detach \
      --hostname gitlab.example.com \
      --publish 443:443 --publish 8080:80 --publish 22:22 \\       --name gitlab \
       - 再次总是\\       --volume C:\ Users \ Public \ Gitlab \ config :/ etc / gitlab \
      --volume C:\ Users \ Public \ Gitlab \ logs :/ var / log / gitlab \
      --volume C:\ Users \ Public \ Gitlab \ data :/ var / opt / gitlab \
   gitlab / gitlab-CE:最新

在容器上收到此错误

# Logfile created on 2017-06-21 16:33:44 +0000 by logger.rb/56438
[2017-06-21T16:33:45+00:00] INFO: Started chef-zero at chefzero://localhost:8889 with repository at /opt/gitlab/embedded
  One version per cookbook

[2017-06-21T16:33:45+00:00] INFO: Forking chef instance to converge...
[2017-06-21T16:33:45+00:00] INFO: *** Chef 12.12.15 ***
[2017-06-21T16:33:45+00:00] INFO: Platform: x86_64-linux
[2017-06-21T16:33:45+00:00] INFO: Chef-client pid: 26
[2017-06-21T16:33:45+00:00] WARN: unable to detect ipaddress
[2017-06-21T16:33:46+00:00] INFO: HTTP Request Returned 404 Not Found: Object not found: chefzero://localhost:8889/nodes/9ca249ba6250
[2017-06-21T16:33:46+00:00] INFO: Setting the run_list to ["recipe[gitlab]"] from CLI options
[2017-06-21T16:33:46+00:00] INFO: Run List is [recipe[gitlab]]
[2017-06-21T16:33:46+00:00] INFO: Run List expands to [gitlab]
[2017-06-21T16:33:46+00:00] INFO: Starting Chef Run for 9ca249ba6250
[2017-06-21T16:33:46+00:00] INFO: Running start handlers
[2017-06-21T16:33:46+00:00] INFO: Start handlers complete.
[2017-06-21T16:33:46+00:00] INFO: HTTP Request Returned 404 Not Found: Object not found: 
[2017-06-21T16:33:47+00:00] INFO: Loading cookbooks [gitlab@0.0.1, runit@0.14.2, package@0.0.0]
[2017-06-21T16:33:47+00:00] INFO: directory[/etc/gitlab] mode changed to 775
[2017-06-21T16:33:47+00:00] WARN: Skipped selecting an init system because it looks like we are running in a container
[2017-06-21T16:33:48+00:00] INFO: template[/var/opt/gitlab/.gitconfig] owner changed to 998
[2017-06-21T16:33:48+00:00] INFO: template[/var/opt/gitlab/.gitconfig] group changed to 998
[2017-06-21T16:33:48+00:00] INFO: template[/var/opt/gitlab/.gitconfig] mode changed to 644
[2017-06-21T16:33:48+00:00] INFO: Running queued delayed notifications before re-raising exception
[2017-06-21T16:33:48+00:00] ERROR: Running exception handlers
[2017-06-21T16:33:48+00:00] ERROR: Exception handlers complete
[2017-06-21T16:33:48+00:00] FATAL: Stacktrace dumped to /opt/gitlab/embedded/cookbooks/cache/chef-stacktrace.out
[2017-06-21T16:33:48+00:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
[2017-06-21T16:33:48+00:00] ERROR: ruby_block[directory resource: /var/opt/gitlab/git-data] (gitlab::gitlab-shell line 26) had an error: Mixlib::ShellOut::ShellCommandFailed: Failed asserting that ownership of "/var/opt/gitlab/git-data" was git
---- Begin output of set -x && [ "$(stat --printf='%U' $(readlink -f /var/opt/gitlab/git-data))" = 'git' ] ----
STDOUT: 
STDERR: + readlink -f /var/opt/gitlab/git-data
+ stat --printf=%U /var/opt/gitlab/git-data
+ [ root = git ]
---- End output of set -x && [ "$(stat --printf='%U' $(readlink -f /var/opt/gitlab/git-data))" = 'git' ] ----
Ran set -x && [ "$(stat --printf='%U' $(readlink -f /var/opt/gitlab/git-data))" = 'git' ] returned 1
[2017-06-21T16:33:48+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

请帮忙,我做错了什么?

2 个答案:

答案 0 :(得分:2)

hyperv文件共享机制不支持unix样式文件权限。因此,当应用程序尝试断言所有权符合预期时,会遇到错误。我猜它会尝试做一个' chown',然后是输出中描述的以下shell行:

[ "$(stat --printf='%U' $(readlink -f /var/opt/gitlab/git-data))" = 'git' ]

错误消息表明它希望所有者成为' git',但它得到了“root”'代替。

你有两个主要的可能性。您可以尝试配置/更改容器内运行的进程以处理这种情况。这可能就像更改配置一样简单,因此它需要' root'而不是' git'。它最终可能会涉及更多。您的里程可能会有所不同。

您的另一个选择是不使用不能正确支持unix样式权限和所有权的文件系统。这意味着您应该切换到使用命名卷,或者切换回使用Docker For Windows设置的hyperv vm中的主机卷。无论哪种方式,您的文件都将驻留在VM中,而不是驻留在主机的文件系统中。

我建议在这种情况下使用命名卷。请记住,如果重置Docker For Windows VM,则指定卷中的所有数据也将被重置。

答案 1 :(得分:1)

我认为我有一个在Windows 10上从Docker运行Gitlab的解决方案;到目前为止,它似乎对我仍然有效。

对于所有Powershell,您都需要一个提升的提示。

初始化

第一部分将获取文件夹/卷的设置,然后创建并启动Gitlab容器。 (请记住,您必须运行Docker Desktop,并告诉它共享C驱动器。)

mkdir c:\GitlabConfig
mkdir c:\GitlabConfig\backups

docker volume create gitlab-logs
docker volume create gitlab-data 
docker run --detach `
    --name gitlab `
    --restart always `
    --hostname gitlab.local `
    --publish 4443:443 --publish 4480:80 --publish 8222:22 `
    --volume C:\GitlabConfig:/etc/gitlab `
    --volume gitlab-logs:/var/log/gitlab `
    --volume gitlab-data:/var/opt/gitlab `
    gitlab/gitlab-ce

等待几分钟,让Gitlab完成初始化;只需在浏览器中不断刷新“ localhost:4480 /”,直到出现网页即可。

您现在可以按计划使用Gitlab。

备份

编辑c:\GitlabConfig\gitlab.rb文件。找到指示的2个设置,取消注释,并按如下所示进行设置(这将是最终的结果):

  

gitlab_rails ['manage_backup_path'] = false

     

gitlab_rails ['backup_path'] =“ / etc / gitlab / backups”

请注意,“ backups”文件夹与主机在开始时在主机上创建的文件夹相同,只是在容器内如何知道它。

下一步,重新启动容器。

docker restart gitlab

现在您可以备份Gitlab,它将显示在Windows主机上

docker exec -it gitlab gitlab-rake gitlab:backup:create

该过程完成后,您将在Windows中看到一个c:\GitlabConfig\backups\{prefix}_gitlab_backup.tar文件。

还原

一旦一切准备好还原,您就可以运行

gitlab gitlab-rake gitlab:backup:restore BACKUP={prefix}

{prefix} 是要用于还原的文件名的“ _gitlab_backup.tar”之前的所有内容。恢复功能将显示在您先前在gitlab.rb文件中配置的文件夹中。

通过这种方法,我已经能够在Windows 10上设置一个正在运行的Gitlab容器。我可以使用任何我喜欢的方法来备份主“ c:\ GitlabConfig”文件夹。

此外,您可以对容器和2个docker-volume进行核对,并从头开始仅包含该文件夹的内容。如果通过将新容器指向保存的config文件夹来启动新容器,它将立即使您的大部分东西得到使用。但是,在完成启动后,您可以还原备份,您将回到原来的位置。文档目前表明在Gitlab在容器中运行时还原存在问题,但是我没有任何问题。如果还原遇到麻烦,请it should tell you what you need to fix before trying again