【问题标题】:Volume trouble with GitLab docker image on WindowsWindows 上 GitLab docker 映像的体积问题
【发布时间】:2017-11-24 20:39:35
【问题描述】:

我正在尝试通过 docker 在我的 Windows 10 上运行官方映像 gitlab/gitlab-ce:latest
首先我尝试如下运行它并且成功了。

docker 运行 --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 设置(桌面应用程序)中成功地从主机(窗口)共享了我的磁盘 C:/ 并对其进行了测试。 Window的文件夹共享,我可以看到测试容器中的文件。

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

docker 运行 --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)

请帮忙,我做错了什么?

【问题讨论】:

    标签: windows docker gitlab


    【解决方案1】:

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

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

    初始化

    这第一部分获取文件夹/卷设置,然后创建并启动 Gitlab 容器。 (请记住,您必须让 Docker 桌面运行并告诉它共享 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"

    请注意,“备份”文件夹与一开始在主机上创建的文件夹相同,只是它在容器中的已知方式。

    接下来,重启容器。

    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-volumes 进行核对,然后仅使用该文件夹的内容从头开始。如果您通过将新容器指向您保存的配置文件夹来启动新容器,那么它会立即包含您的大部分内容。但是在它完成启动后,您可以恢复备份,然后您就会回到原来的位置。文档目前表明当 Gitlab 在容器中运行时恢复存在问题,但我没有任何问题。如果恢复遇到问题,it should tell you what you need to fix before trying again

    【讨论】:

      【解决方案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,命名卷中的任何数据也将被重置。

      【讨论】:

      • 非常感谢!!!我制作了 3 个命名卷。可惜不能制作子目录,备份过程有点复杂。
      • @Sergei Tcvetkov 已经尝试解决这个问题 3 天了。可怕的问题。不敢相信文档中没有提到这一点。如何创建 3 个命名卷,这样做有什么影响?
      • @Jus12 任何人都可以使用命名卷发布他们的 dockerfile 吗?
      • 版本:“3”服务:网络:图像:'gitlab/gitlab-ce:latest'重启:总是主机名:'gitlab.dev'环境:GITLAB_OMNIBUS_CONFIG:| external_url 'gitlab.dev' 端口: - '8080:80' - '2222:22' 卷: - '/srv/gitlab/config:/etc/gitlab' - '/srv/gitlab/logs:/var/log/ gitlab' - 'gitlab-data:/var/opt/gitlab' 卷:gitlab-data: external: true
      • 您收到一个错误,因为它没有修复它。命名卷不存在于容器之外;您可能根本不映射“/var/opt”。 GitLab hasn't figured out how to fix the error yet。发布的解决方法都没有真正起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2020-03-04
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多