本篇内容介绍了“docker怎么制作镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
使用过docker的都知道dockerfile,其用于定义制作镜像的流程,由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
有时候,我们想在原有镜像基础上修改、增加文件,由于国内网络原因,重新制作镜像会很慢,甚至失败;或者根本不知道镜像的dockerfile长什么样。改动很小情况下,可以用以下方式制作镜像。
拿k8s负载均衡器组件ingress-nginx:0.24.1版本为例:
如果我们修改了其源码,并编译生成nginx-ingress-controller二进制文件,可以用以下方式进行制作新镜像。
首先用命令:
docker run -ti --rm k8s-deploy/nginx-ingress-controller:0.24.1 bash
将镜像运行起来。其中-ti表示打开一个交互输入终端;--rm表示运行停止后自动清理。
运行后可以看到默认用户为www-data,a298fe62a4f9表示容器id
我们可以在容器里创建目录:
重新打开一个shell窗口,用于给容器内复制一个测试文件:
docker cp ingressgroup-upstream.tmpl a298fe62a4f9:/etc/nginx/conf.d/include-server-map/
复制进去后,当要将其移动到其他位置时,报Permission denied权限不足,因为默认为www-data用户,复制到容器内的ingressgroup-upstream.tmpl属主:属组也是root,如果不把root修改为www-data,肯定会报没权限的错。
通过以下命令重新运行镜像:
docker run -ti --rm -u 0 k8s-deploy/nginx-ingress-controller:0.24.1 bash
-u 0代表用root用户运行容器,而不是dockerfile里指定的用户,这样运行后可以看到用户为root,记录容器id:ffdc80f3cce7
重新执行复制操作:
此时就可以随意移动和修改文件的权限、属组、属主了。
修改完毕后,执行以下命令将镜像commit到本地仓库:
docker commit ffdc80f3cce7 k8s-deploy/nginx-ingress-controller:0.24.1-temp
commit后跟的是容器id,最后跟的是新镜像名称。push命令将新镜像推到远程harbor仓库。
运行新制作的镜像,可以看到我们修改的文件。
这种方式一般用于测试,弊端是可能会导致镜像越来越大。
“docker怎么制作镜像”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。