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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker上传镜像到私有仓库_docker仓库的创建

    docker上传镜像到私有仓库_docker仓库的创建Docker私有仓库的搭建、配置,镜像上传至私有仓库案例演示。

    2025年6月2日
    0
  • docker启动mysql报错_mysql查看root密码

    docker启动mysql报错_mysql查看root密码dockerrun–name=mediawiki_mysql\-eMYSQL_DATABASE=wikidb\-eMYSQL_USER=wikiuser\-eMYSQL_PASSWORD=mysecret\-eMYSQL_ROOT_PASSWORD=zhang123\-v/var/mediawiki/mysql:/var/lib/mysql\-dmysql:5.7启动…

    2022年10月5日
    0
  • docker下载安装教程_docker镜像存储位置

    docker下载安装教程_docker镜像存储位置前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D

    2022年7月29日
    4
  • 【docker安装RabbitMQ详细步骤】

    【docker安装RabbitMQ详细步骤】docker安装RabbitMQ详细步骤1.启动rabbitmqcd/opt/rabbitmqmkdirdata#拉取镜像dockerpullrabbitmq#查看镜像dockerimages#拉取镜像到本地仓库,这里是直接安装最新的,#如果需要安装其他版本在rabbitmq后面跟上版本号即可#dockerpullrabbitmq#启动rabbitMqdockerrun-d\-v/opt/rabbitmq/data:/var/lib/rabbit

    2022年5月23日
    38
  • docker启动MySQL报错

    docker启动MySQL报错一.问题描述今天用docker拉取了MySQL镜像,但是启动的时候遇到了问题。error:databaseisuninitializedandpasswordoptionisnotspecifiedYouneedtospecifyoneofMYSQL_ROOT_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORDandMYSQL_RANDOM_ROOT_PASSWORD二.解决由于没有找到其他帖子上在图形化界面上操作的修改,因此我们选

    2022年10月6日
    0
  • docker 常用命令_常用docker命令

    docker 常用命令_常用docker命令文章目录Docker命令总结docker常用命令docker命令大全常用命令由个人学习总结。命令大全翻译自官方最新(2021.05.19)文档,如有错误,请参阅官网。感谢纠正!Docker命令总结Docker官方帮助文档docker常用命令#info|versiondockerinfo#显示docker的系统信息,包括镜像和容器的数量dockerversion#显示docker的版本信息。#帮助命令docker命令–help#帮助命令#镜像命令d

    2022年9月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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