zoukankan      html  css  js  c++  java
  • docker镜像制作必备技能

    正文

    使用过docker的都知道dockerfile,其用于定义制作镜像的流程,由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。可参考往期文章学习:docker基础知识整理

    有时候,我们想在原有镜像基础上修改、增加文件,由于国内网络原因,重新制作镜像会很慢,甚至失败;或者根本不知道镜像的dockerfile长什么样。改动很小情况下,可以用以下方式制作镜像。

    拿k8s负载均衡器组件ingress-nginx:0.24.1版本为例:
    image.png
    如果我们修改了其源码,并编译生成nginx-ingress-controller二进制文件,可以用以下方式进行制作新镜像。

    首先用命令:

    docker run -ti --rm k8s-deploy/nginx-ingress-controller:0.24.1 bash
    

    将镜像运行起来。其中-ti表示打开一个交互输入终端;--rm表示运行停止后自动清理。

    运行后可以看到默认用户为www-data,a298fe62a4f9表示容器id
    image.png

    我们可以在容器里创建目录:
    image.png

    重新打开一个shell窗口,用于给容器内复制一个测试文件:

    docker cp ingressgroup-upstream.tmpl a298fe62a4f9:/etc/nginx/conf.d/include-server-map/
    

    image.png

    复制进去后,当要将其移动到其他位置时,报Permission denied权限不足,因为默认为www-data用户,复制到容器内的ingressgroup-upstream.tmpl属主:属组也是root,如果不把root修改为www-data,肯定会报没权限的错。

    image.png

    通过以下命令重新运行镜像:

    docker run -ti --rm -u 0 k8s-deploy/nginx-ingress-controller:0.24.1 bash
    

    -u 0代表用root用户运行容器,而不是dockerfile里指定的用户,这样运行后可以看到用户为root,记录容器id:ffdc80f3cce7

    image.png

    重新执行复制操作:

    image

    此时就可以随意移动和修改文件的权限、属组、属主了。

    image

    修改完毕后,执行以下命令将镜像commit到本地仓库:

    docker commit ffdc80f3cce7 k8s-deploy/nginx-ingress-controller:0.24.1-temp
    

    commit后跟的是容器id,最后跟的是新镜像名称。push命令将新镜像推到远程harbor仓库。

    image

    运行新制作的镜像,可以看到我们修改的文件。

    image

    这种方式一般用于测试,弊端是可能会导致镜像越来越大。



    本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。


    扫码关注,精彩内容第一时间推给你

    image

  • 相关阅读:
    读《大道至简》第6章有感
    Java作业05(动手动脑)
    读《大道至简》第五章有感
    java作业04(动手动脑)
    域名与主机名
    STL 迭代器学习
    数组与链表增删改查效率比较
    智能指针多线程安全问题
    快速乘 学习
    关于TCP三个冗余ACK启动快速重传
  • 原文地址:https://www.cnblogs.com/liabio/p/11683521.html
Copyright © 2011-2022 走看看