在Jenkins Docker容器内执行Docker主机命令

7

我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个运行jenkins的docker容器。我想在这个容器内部启动其他容器,从而在容器外部执行。

我尝试使用以下命令启动我的jenkins控制器:

docker run -v /var/run/docker.sock:/var/run/docker.sock  -v $(which docker):/bin/docker

如此写道:https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

但是当我在容器内尝试运行Docker命令时,会收到典型的消息。

 FATA[0000] Get http://%2Fvar%2Frun%2Fdocker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: 
connect: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS? 

这个容器内无法运行docker命令。

我尝试了使用和不使用--privileged=true,但它仍然无法工作。

如果您有任何想法!


你尝试在命令前添加 "sudo" 吗?或者确保服务正在运行 "sudo service docker start"。或者将您的用户添加到组中:"sudo usermod -aG docker username",然后注销或重新启动以生效。 - JeffProd
我也遇到了类似的问题,但错误信息不同:“无法连接到Docker守护进程。该主机上是否运行着Docker守护进程?” - Tri Nguyen
2个回答

2
与此问题相关的帖子是这个
然而,关于这个问题,有两件事情你需要做:(1) 挂载docker.sock 和 (2) 启动docker 服务。
关于 (1): 如@yclian所述,您需要将jenkins用户加入docker组。
我遵循了Adrian Mouat的指导。他建议使用sudo docker run ..命令在构建步骤中执行docker命令。在我的情况下,sudo是可以的,但一般来说可能存在安全问题,因为Jenkins用户可能会获得对主机的root访问权限,并创建挂载主机上任意目录的容器。
关于 (2) 和你的命令中的-v $(which docker):/bin/docker。我使用MacOS。 which docker给出了正确的/usr/local/bin/docker/,但在容器内部仍然无法使用docker。我用以下命令启动了jenkins容器:
docker run -p 8080:8080 -p 50000:50000 -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /Users/matthaeus/.jenkins_home:/var/jenkins_home -t -i jenkins

如果您不想这样做,您必须在容器内安装docker引擎,可以通过连接到容器(docker exec -t -i 容器id /bin/bashapt-get install docker-engine)手动安装,或在Dockerfile中指定它。
如果您已经完成了这两个步骤,那么您的构建步骤可能包含以下命令:sudo docker build -t 我的镜像 .并且该镜像也将在主机上可用。

0
当出现这种情况时,首先查看一下它正在拨号的 `/var/run/docker.sock`。如果我没记错的话,你需要将你的 `jenkins` 用户加入 `docker` 组,以便访问套接字文件。
另外,通过以 `jenkins` 用户身份登录 shell 进行故障排除也是一个好方法,而不是通过 Jenkins UI 进行故障排除。

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