请选择 进入手机版 | 继续访问电脑版

Docker基础实战教程三:Dockerfile

[复制链接]
谢世民 发表于 2021-1-2 19:43:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
镜像是分层存储的,其制作过程实际上是对每一层需要添加的设置、文件等举行定制。Dockerfile本质上就是一个制作镜像的脚本,将每一层的修改、安装、构建、使用等下令都在这个脚本中举行清晰透明的界说。
本实训将详细先容Dockerfile制作镜像的语法及下令,以及其制作流程。通过本实训,学习者应根本掌握基于Dockerfile的镜像制作。

初识Dockerfile
  1. #创建一个空文件夹,并进入此中mkdir newdir1cd newdir1#创建一个Dockerfile文件touch Dockerfile#假设我的Dockerfile文件为#FROM ubuntu#RUN mkdir dir1#可以这么写:# echo 'FROM ubuntu' > Dockerfile# echo 'RUN mkdir dir1'>> Dockerfile#输入Dockerfile文件内容#********** Begin *********##以busybox为根本镜像#在根本镜像的根本上,创建一个hello.txt文件echo 'FROM busybox' > Dockerfileecho 'RUN touch hello.txt' >>  Dockerfile#********** End **********##使用Dockerfile创建一个新镜像,镜像名为busybox:v1docker build -t busybox:v1 .
复制代码
docker build、COPY和ADD
  1. #创建一个空文件夹,并进入此中mkdir newdir2cd newdir2#创建一个文件夹dir1,将其压缩,然后删除dir1mkdir dir1 && tar -cvf dir1.tar dir1 && rmdir dir1#创建一个Dockerfile文件touch Dockerfile#假设我的Dockerfile文件为#FROM ubuntu#RUN mkdir dir1#可以这么写:# echo 'FROM ubuntu' > Dockerfile# echo 'RUN mkdir dir1'>> Dockerfile#输入Dockerfile文件内容#********** Begin *********#echo 'FROM busybox' > Dockerfile#并将上下文目次下的dir1.tar“解压提取后”,拷贝到busybox:v3的/echo 'ADD dir1.tar /' >>  Dockerfile#********** End **********##文件内容完毕,在当前文件夹中执行#********** Begin *********##以该Dockerfile构建一个名为busybox:v3的镜像docker build -t busybox:v3 .#********** End **********#
复制代码
:CMD和ENTRYPOINT指令
  1. #创建一个空文件夹,并进入此中mkdir newdir3cd newdir3#创建一个Dockerfile文件touch Dockerfile#假设我的Dockerfile文件为#FROM ubuntu#RUN mkdir dir1#可以这么写:# echo 'FROM ubuntu' > Dockerfile# echo 'RUN mkdir dir1'>> Dockerfile#输入Dockerfile文件内容#********** Begin *********##以busybox为根本镜像echo 'FROM busybox' > Dockerfileecho 'ENTRYPOINT ["df"]'>> Dockerfileecho 'CMD ["-Th"]'>> Dockerfile#********** End **********##文件内容完毕,在当前文件夹中执行#********** Begin *********##以该Dockerfile构建一个名为mydisk:latest的镜像docker build -t mydisk:latest .#********** End **********#
复制代码
ENV、EXPOSE、WORKDIR、ARG指令
  1. #创建一个空文件夹,并进入此中mkdir newdir4cd newdir4#创建一个Dockerfile文件touch Dockerfile#假设我的Dockerfile文件为#FROM ubuntu#RUN mkdir dir1#可以这么写:# echo 'FROM ubuntu' > Dockerfile# echo 'RUN mkdir dir1'>> Dockerfile#输入Dockerfile文件内容#********** Begin *********##以busybox为根本镜像echo 'FROM busybox' > Dockerfile#声明袒露3000端口echo 'EXPOSE 3000' >>Dockerfile#将变量var1=test设置为情况变量echo 'ENV var1=test '>>Dockerfile#设置工作目次为/tmpecho 'WORKDIR /tmp'>>Dockerfile#在工作目次下创建一个1.txt文件echo "RUN touch 1.txt" >> Dockerfile#********** End **********##文件内容完毕,在当前文件夹中执行#********** Begin *********##以该Dockerfile构建一个名为testimage:v1的镜像docker build -t testimage:v1 .#********** End **********#
复制代码
ONBUILD和VOLUME指令
  1. #无论任何输入都会认为正确,本关的目的是学习ONBUILD和VOLUME指令ONBUILD指令●ONBUILD添加一个未来执行的触发器(trigger);格式: ONBUILD ;ONBUILD 是一个特殊的指令,它背面跟的是别的指令,好比RUN, COPY等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为根本镜像,去构建下一级镜像的时候才会被执行。ONBUILD指令的详细执行步调(1)在构建过程中,ONBUILD指令会添加到触发器指令镜像元数据中,这些触发器指令并不会在当前构建过程中执行。(2)在构建过程后,触发器指令会被存储在镜像详情中,其主键是OnBuild,可以使用docker inspect下令查察。(3)在之后该镜像大概作为其他Dockerfile中FROM指令的参数。在构建过程中,FROM指令会查找ONBUILD触发器指令,而且会以它们注册的顺序执行。若有触发器指令执行失败,则FROM指令被中止,并返回失败;若所有触发器指令执行乐成,则FROM指令完成并继续执行下面的指令。在镜像构建完成后,触发器指令会被清除,不会被子孙镜像继续。ONBUILD指令的实例1.首先编写一个Dockerfile文件,内容如下所示:FROM busyboxONBUILD RUN touch 1.txt2.使用上面的Dockerfile文件构建一个新镜像:docker build -t image1 .。执行docker run image1 cat 1.txt,提示:cat: can't open '1.txt': No such file or directory。可以知道基于image1镜像构建的容器中不存在1.txt文件。我们通过inspect image1,在内里可以找到。"OnBuild":[    "RUN touch 1.txt"],3.编写一个新的Dockerfile文件,内容如下所示:FROM image1RUN echo 'hello'4.使用第三步创建的的Dockerfile文件构建一个新镜像:docker build -t image2 .。如下所示:在执行完FROM指令后,首先执行的是触发器,也就是# Executing 1 build trigger...,该指令创建了一个1.txt文件。然后才执行RUN echo 'hello'。执行docker run image2 cat 1.txt,执行乐成!![root@localhost dir1]# docker build -t image2 .Sending build context to Docker daemon 2.048 kBStep 1/2 : FROM image1# Executing 1 build trigger...Step 1/1 : RUN touch 1.txt ---> Running in 5c9b99ef7801 ---> 4c5b719176b8Removing intermediate container 5c9b99ef7801Step 2/2 : RUN echo 'hello' ---> Running in 8a2598e90e1fhello ---> f5642bb4a975Removing intermediate container 8a2598e90e1fSuccessfully built f5642bb4a975[root@localhost dir1]# docker run image2 cat 1.txt`[root@localhost dir1]#VOLUME指令●VOLUME界说匿名卷;格式:VOLUME ["", ""...]或VOLUME ;之前我们说过,容器运行时应该只管保持容器存储层不发生写使用,对于数据库类需要生存动态数据的应用,其数据库文件应该生存于数据卷(volume)中,背面的章节我们会进一步先容Docker数据卷的概念。
复制代码
来源:https://blog.csdn.net/weixin_44196785/article/details/112041817
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )