关于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

相关推荐

  • docker重新部署项目_docker一键部署

    docker重新部署项目_docker一键部署Docker为什么出现?阿里云镜像加速、HelloWorld流程底层原理、部署项目1、安装docker2、安装Docker-Compose3、编写相关配置文件Docker-Compose.yml编写Dockerfile编写Nginx的配置4、打包前端后端Docker简介Docker为什么出现?一款产品:开发–上线两套环境!应用环境,应用配置!开发—运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用

    2022年10月18日
  • jenkinsfile docker_python安装虚拟环境

    jenkinsfile docker_python安装虚拟环境前言之前我们用docker手动安装了jenkins环境,在jenkins中又安装了python3环境和各种安装包,如果我们想要在其他3台机器上安装,又是重复操作,重复劳动,那会显得很low,这里可以

  • 每天5分钟玩转docker容器技术 pdf_docker 创建容器

    每天5分钟玩转docker容器技术 pdf_docker 创建容器Docker介绍Docker简介和安装Docker是什么为什么使用Docker和普通虚拟机的对比打包、分发、部署小结Docker部署的优势Docker通常用来做什么重要概念:镜像、容器安装Ubuntu安装DockerWindows安装DockerDocker架构镜像加速源Docker命令服务相关命令镜像相关命令容器相关命令数据卷数据卷概念及其作用配置数据卷数据卷容器应用部署部署MySQL部署tomcat部署Nginx部署reids镜像原理容器转为镜像Dockfile案例部署springboot项目自定义ce

  • docker 修改容器时间_docker开放容器端口

    docker 修改容器时间_docker开放容器端口前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

  • Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」

    Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

  • Dockerfile add_在docker中使用ubuntu

    Dockerfile add_在docker中使用ubuntu前言Dockerfile中提供了两个非常相似的命令COPY和ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景。Build上下文的概念在使用dock

发表回复

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

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