在Windows主机上使用Docker设置Gitlab,问题是共享文件夹

时间:2017-07-17 01:53:22

标签: docker virtualbox gitlab windows-server-2012-r2 docker-toolbox

TLDR;

有谁知道如何解决“失败声明所有权”/ var / opt / gitlab / git-data“是git”错误?

背景

我想在运行Docker工具箱的WindowsServer2012R2上设置Gitlab Docker,版本为17.04.0-ce,版本为4845c56。

问题/问题

我无法让共享文件夹在服务器的D盘上正常工作。我读到我需要将文件夹添加到VirtualBox VM,我通过VB GUI中的设置/共享文件夹菜单进行了操作。我将名称“gitlab”设置为路径“D:\ data \ gitlab”,然后选中自动挂载,永久挂起,并将其设置为完全访问权限。

VM Shared Folder Settings

我启动了docker机器并运行了“docker-machine ssh $ machine-name”。我注意到没有/ media目录,所以我在主目录(/ home / docker / gitlab)中添加了一个文件夹,然后使用我在几个论坛中找到的以下命令挂载共享文件夹:

CalendarManager

此时我可以将文件添加到Windows主机目录或Docker VM,它似乎工作正常,并显示测试文件。

现在,当我启动Gitlab Docker镜像时,我使用从其文档中修改的以下命令:

sudo mount -t vboxsf gitlab /home/docker/gitlab

现在我知道它似乎正在写入共享驱动器,因为所有这些文件都已生成,但几秒钟后它就会崩溃并且我收到以下错误日志。

Files Generated when Running Gitlab Docker

错误日志:

docker run --detach --hostname gitlab.example.com --publish 80:80 --name gitlab --volume /home/docker/gitlab:/etc/gitlab:Z --volume /home/docker/gitlab/logs:/var/log/gitlab:Z --volume /home/docker/gitlab/data:/var/opt/gitlab:Z gitlab/gitlab-ce

有谁知道如何解决“失败声明所有权”/ var / opt / gitlab / git-data“git”错误?我对Docker /设置Gitlab还有些新意​​,所以我很可能忽略了一些简单的东西。我花了几个小时谷歌搜索这个,似乎其他人也有很多问题让Windows使用Docker Toolbox工作共享文件夹,所以希望这对其他人也有帮助。

1 个答案:

答案 0 :(得分:1)

<强>背景

对于我们这些没有本地docker的人来说,一个解决方案(可能不是最好的)是使用vdi驱动器和共享文件夹。 vdi驱动器可以存在于我们想要的驱动器上(如果您不想使用C驱动器,这很重要)并且用于允许Gitlab docker能够提供它想要的任何东西,所以这就是我们所需要的# 39; ll存储持久卷。缺点是vdi不像简单的共享文件夹那样透明,因此对于备份,共享文件夹使事情变得更容易/透明。

<强>声明

我不是这方面的专家,所以请谨慎使用我所说的含盐。

执行步骤

在您喜欢的任何驱动器上创建新的vdi驱动器和共享文件夹

  1. 关闭您要用于gitlab的docker机器
  2. 在虚拟框中,进入docker-machine上的设置,然后存储,然后点击添加硬盘图标,然后创建新磁盘
  3. 选择 VDI(VirtualBox磁盘映像),然后点击下一步
  4. 选择动态分配,然后点击下一步
  5. 通过单击带有绿色胡萝卜符号的文件夹,选择要存储vdi的名称和位置,然后选择vdi可以增长到的最大大小,并单击创建
  6. 现在,在设置菜单中,切换到共享文件夹,然后点击添加新的共享文件夹图标
  7. 创建 gitlabbackups 文件夹,然后选择自动安装永久
  8. 现在对驱动器进行分区和格式化

    1. 启动/进入泊坞机(使用VBox窗口或cmd提示符中的docker-machine ssh <your docker machine name>
    2. 运行fdisk -l列出可用的驱动器,如果您只安装了一个额外的vdi驱动器,则应该看到类似 / dev / sdb
    3. 的内容
    4. 接下来的步骤是不可逆,因此请自行决定:输入命令fdisk /dev/sdb然后n输入新分区,p输入主分区, 1
    5. 现在格式化新分区(您可能还需要sudo):mkfs.ext4 /dev/sdb1
    6. 在第二个vdi上运行具有持久卷的docker,在共享文件夹中运行备份

      示例Dockerfile:

      FROM gitlab/gitlab-ce:latest
      
      RUN apt-get update
      RUN apt-get install -y cron
      
      # Add a cron job to backup everyday
      RUN echo "0 5 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create STRATEGY=copy CRON=1" | crontab -
      # For an unknown reason, the cron job won't actually run unless cron is restarted
      CMD service cron restart && \
          /assets/wrapper
      

      示例docker-compose.yml:

      version: "3.0"
      services:
        gitlab:
          build: .
          restart: always
          ports:
            - "80:80"
          volumes:
            # These volumes are on the vdi we created above
            - "/mnt/sdb1/etc/gitlab/:/etc/gitlab"
            - "/mnt/sdb1/var/log/gitlab:/var/log/gitlab"
            - "/mnt/sdb1/var/opt/gitlab:/var/opt/gitlab"
            # This volume sits in the shared folder defined above
            - "/gitlabbackups:/var/opt/gitlab/backups"
          cap_add:
            # These seem to be necessary for the mounted drive to work properly
            # https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
            - SYS_ADMIN
            - DAC_READ_SEARCH
      

      因为自动挂载vdi似乎存在问题,例如使用启动脚本(假设您使用了D驱动器,只需根据需要替换&lt; ...&gt;内的任何内容),示例run.bat :

      @cd /d D:\<path to docker-compose.yml, assuming it's on the D drive>
      @docker-machine start <docker machine name>
      @FOR /f "tokens=*" %%i IN ('docker-machine env <docker machine name>') DO @%%i
      @docker-machine ssh <docker machine name> sudo mount /dev/sdb1 /mnt/sdb1
      @docker-compose build
      @docker-compose up -d
      @REM If the docker machine was completely off, running only 'docker-compose up -d' will 
      @REM not mount the volumes properly. Stopping and restarting the container results in 
      @REM the volumes mounting properly.
      @docker stop <gitlab container name>
      @docker start <gitlab container name>
      @pause
      

      注意:可以通过运行docker-compose up一次然后docker ps -a来检查它来找到gitlab容器名称,但它通常遵循约定<directory compose file is in>_<name in the compose file, e.g. gitlab here>_1

      假设一切顺利,你根据自己的情况改变了上面的&lt; ...&gt;&#;;你应该能够运行批处理文件并以这种方式运行gitlab它将所有内容存储在备用驱动器上,vdi中的持久工作文件(以解决VBox POSIX限制)以及透明存储在共享文件夹中的备份。

      希望这有助于其他可以访问本地码头工作者的穷人。