关于docker中执行docker命令的实践

关于docker中执行docker命令的实践最近在制作给kubernetesjenkinsplugin调用的jenkinsslave(默认情况下,kubernetesjenkins插件使用的是jenkinsci/jnlp-slave)容器镜像,以供自动创建的pod使用。对这个镜像的需求是:希望在pod运行的容器内,执行docker命令,完成dockerbuild,push等一些操作,即dockerindocker。首先,需要在

大家好,又见面了,我是你们的朋友全栈君。

最近在制作给kubernetes jenkins plugin调用的jenkins slave(默认情况下,kubernetes jenkins插件使用的是jenkinsci/jnlp-slave)容器镜像,以供自动创建的pod使用。对这个镜像的需求是:希望在pod运行的容器内,执行docker命令,完成docker build, push等一些操作,即docker in docker。

首先,需要在容器的镜像里面也安装docker包。然后,通过挂载宿主机的/var/run/docker.sock文件,可以在容器内使用docker命令,而且是跟在当前的宿主机上执行一样。

但是制作的jenkins-slave容器里使用的账号是非root账号jenkins,导致对/var/run/docker.sock没有访问权限,报错如下:
这里写图片描述

通常,为了使非root用户能够执行docker命令,解决办法是:将该用户添加到docker组。

usermod -G docker jenkins

这种方法,在宿主机上配置后,用jenkins用户运行docker是没有问题的,但是容器里面执行docker命令还是报错。分析原因应该是:容器里和宿主机上的docker组的id不一样导致的。
容器里:
这里写图片描述
宿主机上:
这里写图片描述
如上试验发现,容器里docker的组id是996,宿主机上的则为989。这就尴尬了。。。难道就只有用root用户运行了吗?

后来想到通过su命令,jenkins账号可以切换到root命令,于是想到了一种方案。设脚本docker2内容如下:

#!/bin/bash
echo "your_password" | su - root -c "/usr/bin/docker $*"

用这个脚本替代原有的docker命令,这样在执行docker命令之前先完成root用户切换,再执行docker命令。如:docker2 ps就等价于执行了原生的docker ps命令。

不过,这样明文写了容器的root密码在脚本里,可能会不太安全。如果不想这样,可以直接用root用户来运行jenkins slave的容器。但这样jenkins slave的进程也将是按root用户运行了。

另外,实现docker in docker必须要docker里也安装docker包吗?
试验使用docker镜像里没有再安装docker包的镜像,只是通过挂载宿主机的/usr/bin/docker, /var/run/docker.sock来运行容器。发现在该容器里执行docker命令时会出现类似如下的报错:

/usr/bin/docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory

也就是说,在执行docker命令时,并不是一个docker二进制文件就可以通过/var/run/docker.sock来跟宿主机的docker进程交互,还依赖一些其它的库包。在docker里再安装docker包的目的就是为了给docker提供一个完整的运行环境。

备注:
试验用的docker版本是17.03.2-ce,安装了docker包的容器镜像比没安装的镜像大小会多出100M。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145782.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号