【问题标题】:How to mount docker volume with jenkins docker container?如何使用 jenkins docker 容器挂载 docker 卷?
【发布时间】:2017-08-14 05:42:30
【问题描述】:

我在 github 上的容器和项目源代码中运行 jenkins。

我需要在与 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 容器中安装它。

所以问题是:如何显式设置我安装卷的容器?

【问题讨论】:

  • 您最终解决了这个问题吗?我遇到了类似的事情。

标签: docker jenkins continuous-integration


【解决方案1】:

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

Senario 1 - 在 Jenkins docker 容器中运行容器

这不是推荐的方式,explanations 去这里。如果你还需要使用这种方法,那么这个问题就不是问题了。

Senario 2 - 在 Jenkins 容器中运行 docker 客户端

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

如果您尝试使用--volume 或-v 将Jenkins 容器 中的特定目录映射到ContainerA,会出现意外行为。

这是因为--volumes 或-v 会尝试将host 中的目录映射到ContainerA,而不是从Jenkins 容器 中的目录映射>。如果在 host 中找不到目录,那么您将在 ContainerA 中获得一个空目录。

简而言之,我们无法将特定目录从容器A 映射到容器B,我们只能将整个卷从容器A 挂载到容器B,并且volume alias is not supported。

解决方案

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

【讨论】:

    【解决方案2】:

    尝试:

    docker run -d --volumes-from <ContainerID> <YourImage>
    

    其中容器 ID 是您想要从中获取 mont 数据的容器的 ID。

    您还可以通过以下方式创建音量:

    docker volume create <volname>
    

    并将其分配给两个容器

    volumes:
     - <volname>:/srv/app
    

    【讨论】:

      【解决方案3】:

      在 Host 和 Jenkins 之间共享 sock 是我的问题,因为“/var/jenkins_home”很可能是 Jenkins 容器的一个卷。

      我的解决方案是在 systemd 容器中安装 docker,而不共享 sock。

      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 客户端并安装套接字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2017-07-21
      • 1970-01-01
      • 2015-02-08
      • 2019-12-10
      • 2017-04-15
      • 2015-08-19
      相关资源
      最近更新 更多