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

22

我在容器中运行了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容器中安装。

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


3
你最终解决了这个问题吗?我遇到了类似的情况。 - Bryan McGrane
3个回答

12

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

情况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正在运行主机卷(host volume),则可以将主机目录映射到目标容器中。
  2. 否则,您可以使用与Jenkins容器相同位置的新创建的容器内的文件。

4

我的问题是在主机和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客户端并挂载套接字。 - ntwrkguru

4

尝试:

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

其中容器ID是您想要从中挂载数据的容器的ID。

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

docker volume create <volname>

将它分配给两个容器

volumes:
 - <volname>:/srv/app

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接