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”,然后选中自动挂载,永久挂起,并将其设置为完全访问权限。
我启动了docker机器并运行了“docker-machine ssh $ machine-name”。我注意到没有/ media目录,所以我在主目录(/ home / docker / gitlab)中添加了一个文件夹,然后使用我在几个论坛中找到的以下命令挂载共享文件夹:
CalendarManager
此时我可以将文件添加到Windows主机目录或Docker VM,它似乎工作正常,并显示测试文件。
现在,当我启动Gitlab Docker镜像时,我使用从其文档中修改的以下命令:
sudo mount -t vboxsf gitlab /home/docker/gitlab
现在我知道它似乎正在写入共享驱动器,因为所有这些文件都已生成,但几秒钟后它就会崩溃并且我收到以下错误日志。
错误日志:
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工作共享文件夹,所以希望这对其他人也有帮助。
答案 0 :(得分:1)
<强>背景强>
对于我们这些没有本地docker的人来说,一个解决方案(可能不是最好的)是使用vdi驱动器和共享文件夹。 vdi驱动器可以存在于我们想要的驱动器上(如果您不想使用C驱动器,这很重要)并且用于允许Gitlab docker能够提供它想要的任何东西,所以这就是我们所需要的# 39; ll存储持久卷。缺点是vdi不像简单的共享文件夹那样透明,因此对于备份,共享文件夹使事情变得更容易/透明。
<强>声明强>
我不是这方面的专家,所以请谨慎使用我所说的含盐。
执行步骤
在您喜欢的任何驱动器上创建新的vdi驱动器和共享文件夹
现在对驱动器进行分区和格式化
docker-machine ssh <your docker machine name>
)fdisk -l
列出可用的驱动器,如果您只安装了一个额外的vdi驱动器,则应该看到类似 / dev / sdb fdisk /dev/sdb
然后n
输入新分区,p
输入主分区, 1
mkfs.ext4 /dev/sdb1
在第二个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限制)以及透明存储在共享文件夹中的备份。
希望这有助于其他可以访问本地码头工作者的穷人。