当前位置: 首页 > 知识库问答 >
问题:

Docker中的Docker无法装入卷

璩正志
2023-03-14

我正在运行一个Jenkins集群,其中主集群和从集群都作为Docker容器运行。

主机是在MacOS上运行的最新boot2docker VM。

为了让Jenkins能够使用Docker执行部署,我安装了Docker。从主机到Jenkins容器的sock和docker客户端,如下所示:-

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v $HOST_JENKINS_DATA_DIRECTORY/jenkins_data:/var/jenkins_home -v $HOST_SSH_KEYS_DIRECTORY/.ssh/:/var/jenkins_home/.ssh/ -p 8080:8080 jenkins

我在将卷安装到在Jenkins容器内运行的Docker容器时面临问题。例如,如果我需要在Jenkins容器中运行另一个容器,我将执行以下操作:-

sudo docker run -v $JENKINS_CONTAINER/deploy.json:/root/deploy.json $CONTAINER_REPO/$CONTAINER_IMAGE 

上面运行的是容器,但文件“deploy.json”不是作为文件装载的,而是作为“目录”装载的。即使将目录装载为卷,也无法查看结果容器中的文件。

由于Docker案例中Docker的文件权限,这是一个问题吗?

共有3个答案

窦华晖
2023-03-14

在这些帖子中有很多好的信息,但我发现没有一个是非常清楚他们指的是哪个容器。因此,让我们为3种环境贴上标签:

  • 主持人:H
  • 在H:D上运行的docker容器
  • docker容器在D:D2中运行

我们都知道如何将文件夹从H装入D:从D开始

docker run ... -v <path-on-H>:<path-on-D> -v /var/run/docker.sock:/var/run/docker.sock ...

挑战是:您希望path-on-H作为path-on-D2在D2中可用。

但是当我们试图将相同的H上路径加载到D2时,我们都被咬了,因为我们在D2开始时

docker run ... -v <path-on-D>:<path-on-D2> ...

当您与D共享H上的docker套接字时,在D中运行docker命令实际上是在H上运行它们。事实上,如果你像这样开始D2,所有的工作(起初非常出乎意料,但当你想到它时是有意义的):

docker run ... -v <path-on-H>:<path-on-D2> ...

下一个棘手的问题是,对我们许多人来说,path-on-H将根据运行它的人而改变。有许多方法可以将数据传递给D,这样它就知道在H上使用什么path,但最简单的可能是环境变量。为了使这种var的目的更清楚,我以DIND_开始它的名字。然后从H开始D这样:

docker run ... -v <path-on-H>:<path-on-D> --env DIND_USER_HOME=$HOME \
    --env DIND_SOMETHING=blabla -v /var/run/docker.sock:/var/run/docker.sock ...

从D开始D2像这样:

docker run ... -v $DIND_USER_HOME:<path-on-D2> ...
钱澄邈
2023-03-14

另一种方法是使用命名卷或数据卷容器。这样,里面的容器就不必知道主机的任何信息,Jenkins容器和构建容器都以相同的方式引用数据卷。

我试过做一些和你现在做的相似的事情,除了一个代理,而不是使用詹金斯大师。问题是相同的,我无法在内部容器中装载Jenkins工作区。对我有效的方法是使用数据卷容器方法,并且工作区文件对代理容器和内部容器都是可见的。我喜欢这种方法的地方在于两个容器以相同的方式引用数据量。使用内部容器装载目录会很棘手,因为内部容器现在需要了解有关其父容器运行的主机的一些信息。

我在这里有关于我的方法的详细博客文章:

http://damnhandy.com/2016/03/06/creating-containerized-build-environments-with-the-jenkins-pipeline-plugin-and-docker-well-almost/

以及此处的代码:

https://github.com/damnhandy/jenkins-pipeline-docker

在我的具体情况下,并不是所有的工作方式,我希望它在詹金斯管道插件方面。但是它确实解决了内部容器能够访问Jenkins工作区目录的问题。

公孙宇
2023-03-14

Docker容器中的Docker容器使用父主机的Docker守护进程,因此,在"docker-in-docker"案例中挂载的任何卷仍然是从主机引用的,而不是从容器引用的。

因此,从Jenkins容器装载的实际路径在主机中“不存在”。因此,在空的“docker in docker”容器中创建一个新目录。当目录装载到容器中的新Docker容器时,同样的情况也适用。

非常基本和明显的东西,我错过了,但意识到我一打问题。

 类似资料:
  • 问题内容: 我正在运行一个Jenkins集群,其中在Master和Slave中,它们都作为Docker容器运行。 主机是在MacOS上运行的最新的boot2docker VM。 为了使Jenkins能够使用Docker执行部署,我将docker.sock和docker客户端从主机安装到Jenkins容器,如下所示: 在将卷装载到Jenkins容器中运行的Docker容器时,我遇到了问题。例如,如果

  • 我有一个Python flask应用程序,它需要LDAP身份验证。我正在尝试为此创建Docker文件,Docker生成失败,出现以下错误, 我有python-ldap已经安装,也pip安装-rrequirements.txt工作正常,但Docker给一个错误。我有Mac OS。 我查找了以前的问题,发现您应该尝试安装Dependencies, sudo apt-get安装libsasl2-dev

  • 已从deb软件包安装docker1.6,但在运行时出现问题: sudo docker版本客户端版本: 1.6.2客户端API版本: 1.18 Go版本(客户端): go1.4.2 Git提交(客户端): 7c8fca2 OS/Arch(客户端): linux/amd64 FATA[0000]获取超文本传输协议:///var/run/docker.sock/v1.18/version:拨号unix

  • 我基于Ubuntu 16构建了Docker,希望PuTTY能够访问Ubuntu。我已将该行添加到docker文件中: 但是当我建立它给我的形象时 5/18步:运行apt get install openssh server-y supervisor--- 如何修复它?我的任务是:允许通过PuTTY从主机(Windows)连接到docker容器。

  • 步骤: < li >在此处安装windows Docker(稳定) < li >试图运行:出现错误,必须在BIOS中启用硬件辅助虚拟化和数据执行保护。 < li >到此处阅读 < li >确保我已打开64位windows 10 pro和hyper-v。 < Li > < img src = " https://I . stack . imgur . com/ly hvm . png " alt =