如何在Jenkins Docker容器中挂载Docker卷?
如何在Jenkins Docker容器中挂载Docker卷?
我在容器中运行着Jenkins,并在Github上存放着项目源代码。
我需要在与Jenkins相同的主机上的容器中运行项目,但不希望使用docker-in-docker,我希望将它们作为兄弟容器运行。
我的流水线如下:
- 从Github上拉取源代码
- 构建项目镜像
- 运行项目容器
目前,我正在使用Jenkins容器中主机的docker套接字:
/var/run/docker.sock:/var/run/docker.sock
当Jenkins容器将源代码从/var/jenkins_home/workspace/BRANCH_NAME挂载到项目容器时,我遇到了问题:
volumes:
- ./servers/identity/app:/srv/app
我在项目容器中得到了一个空文件夹"/srv/app"。
我猜测问题可能是Docker试图从主机而不是Jenkins容器挂载它。
所以问题是:我如何明确地设置从哪个容器挂载卷?
问题原因:将sock共享给主机和Jenkins是我的问题,因为"/var/jenkins_home"很可能是Jenkins容器的一个卷。
解决方法:我的解决方法是在一个没有共享sock的systemd容器内安装docker。
docker run -d --name jenkins \ --restart=unless-stopped \ --privileged \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v jenkins-vol:/var/lib/jenkins \ --tmpfs /run \ --tmpfs /run/lock \ ubuntu:16.04 /sbin/init
然后在其中安装Jenkins、Docker和Docker Compose。
过于复杂。只需要在Jenkins容器内安装docker客户端并挂载套接字即可。
当我使用Jenkins docker容器运行另一个容器时,遇到了相同的问题。
场景1 - 在Jenkins docker容器内运行容器
这并不是一种推荐的方式,具体解释可以参考这里。如果你仍然需要使用这种方法,那么这个问题就不是问题了。
场景2 - 在Jenkins容器内运行docker客户端
假设我们需要在Jenkins docker容器内运行另一个容器(ContainerA),docker pipeline插件将使用--volumes-from
将Jenkins容器卷挂载到ContainerA上。
如果你尝试使用--volume
或-v
将Jenkins容器中的特定目录映射到ContainerA上,你将会得到一个意外的行为。
这是因为--volumes
或-v
会尝试将主机中的目录映射到ContainerA上,而不是从Jenkins容器中的目录映射。如果在主机中找不到这些目录,那么你将得到一个空的目录在ContainerA中。
简而言之,我们无法将容器A中的特定目录映射到容器B中,我们只能将整个卷从容器A挂载到容器B上,并且不支持卷别名。
解决方法:
- 如果你的Jenkins是使用主机卷运行的,你可以将主机目录映射到目标容器。
- 否则,你可以通过与Jenkins容器相同的位置访问新创建容器内的文件。