如何在Jenkins Docker容器中挂载Docker卷?

11 浏览
0 Comments

如何在Jenkins Docker容器中挂载Docker卷?

我在容器中运行着Jenkins,并在Github上存放着项目源代码。

我需要在与Jenkins相同的主机上的容器中运行项目,但不希望使用docker-in-docker,我希望将它们作为兄弟容器运行。

我的流水线如下:

  1. 从Github上拉取源代码
  2. 构建项目镜像
  3. 运行项目容器

目前,我正在使用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容器挂载它。

所以问题是:我如何明确地设置从哪个容器挂载卷?

0
0 Comments

在使用Jenkins的Docker容器时,有一个问题是如何挂载Docker卷。有两种解决方法:

1. 使用已有的容器来挂载数据:

   docker run -d --volumes-from  
   

其中,ContainerID是你想要从中挂载数据的容器的ID。

2. 创建一个新的卷,并将其分配给两个容器:

   docker volume create 
   

volumes:

- :/srv/app

其中,volname是你想要创建的卷的名称。

这样,就可以成功挂载Docker卷到Jenkins的Docker容器中了。

0
0 Comments

问题原因:将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客户端并挂载套接字即可。

0
0 Comments

当我使用Jenkins docker容器运行另一个容器时,遇到了相同的问题。

场景1 - 在Jenkins docker容器内运行容器

这并不是一种推荐的方式,具体解释可以参考这里。如果你仍然需要使用这种方法,那么这个问题就不是问题了。

场景2 - 在Jenkins容器内运行docker客户端

假设我们需要在Jenkins docker容器内运行另一个容器(ContainerA),docker pipeline插件将使用--volumes-fromJenkins容器卷挂载到ContainerA上。

如果你尝试使用--volume-vJenkins容器中的特定目录映射到ContainerA上,你将会得到一个意外的行为。

这是因为--volumes-v会尝试将主机中的目录映射到ContainerA上,而不是从Jenkins容器中的目录映射。如果在主机中找不到这些目录,那么你将得到一个空的目录在ContainerA中。

简而言之,我们无法将容器A中的特定目录映射到容器B中,我们只能将整个卷从容器A挂载到容器B上,并且不支持卷别名

解决方法:

  1. 如果你的Jenkins是使用主机卷运行的,你可以将主机目录映射到目标容器。
  2. 否则,你可以通过与Jenkins容器相同的位置访问新创建容器内的文件。
0