在使用Jenkins的Kubernetes实例上使用docker-compose - 挂载空卷。
在使用Jenkins的Kubernetes实例上使用docker-compose - 挂载空卷。
我使用Google的Jenkins on Kubernetes解决方案搭建了一个Jenkins实例。我没有更改Kubernetes Pod的任何设置。
当我触发一个新的作业时,我能够成功地使一切运行起来,直到测试阶段。
我的测试使用docker-compose。首先,我确保在实例上安装了docker(1.5-1+b1)和docker-compose(1.8.0-2)(我知道我可以通过使用已经包含这些的镜像来优化这一点,但我仍然只处于概念验证阶段)。
当我运行docker-compose up命令时,一切正常,服务开始它们的初始化脚本。然而,挂载点是空的。我已经验证了文件在Jenkins从机上的存在,并且在运行docker-compose时,挂载点在docker服务内创建,但是它们是空的。
一些信息:
为了避免文件权限问题,我使用/tmp作为Jenkins工作空间。我使用SCM拉取我的文件(成功),在docker-compose文件中,我指定了version: '2'和带有绝对路径的挂载路径。失败的服务的卷部分如下所示:
volumes:
- /tmp/automation:/opt/automation
我将在服务中运行的命令更改为ls /opt/automation,结果是一个空目录。
我漏掉了什么?我只是想将一个目录挂载到我的docker-compose服务中。在Windows、Ubuntu和Centos设备上,这个工作得很完美。为什么在Kubernetes实例上不起作用?
在使用Docker容器内的Docker容器时,它使用父主机的Docker守护程序,因此,在“docker-in-docker”情况下挂载的任何卷仍然是从主机而不是容器引用的。因此,在Jenkins容器中挂载的实际路径在主机中“不存在”。因此,在“docker-in-docker”容器中创建了一个空目录。当将目录挂载到容器内的新Docker容器时,情况也是一样。
因此,似乎不可能将外部Docker容器中的内容挂载到内部Docker容器中。必须找到另一种解决方案。
根据上述问题,在Kubernetes实例上使用Docker Compose时,无法将外部Docker容器中的内容挂载到内部Docker容器中的问题出现的原因是因为内部Docker容器使用的是主机的Docker守护进程,导致挂载的卷是从主机而不是容器引用的。这导致在Jenkins容器中挂载的路径在主机中不存在,从而在内部Docker容器中创建了一个空目录。
为了解决这个问题,需要找到另一种解决方案。