Dockerfile详解及优化
Dockerfile详解
0. Dockerfile的作用
docker可以根据Dockerfile中的指令来构建docker镜像。Dockerfile是一个文本文件,其应当包含用户想要构建一个镜像的所有指令。
1. 构建镜像的流程
真正执行构建任务的(就是读取Dockerfile中的指令构建新的镜像)是docker deamon。
- 执行 docker build -t images-name:tag .
- docker client会先将 当前目录下的所有文件递归的发送给docker deamon
- docker deamon检查Dockerfile是否有有语法错误,有错误则停止构建并将错误发送给docker client,没有错误继续执行
- docker deamon根据Dockerfile中的指令,一行一行的进行镜像的构建
- 构建成功后,docker deamon自动清理context.
1. Dockerfile支持的指令
- FROM <image>[:tag] #代表着一个新的build stage的开始,并确定这个build是基于哪个镜像来构建新的镜像,在所有的指令中只有这个是必须要有的。
- ENV <key>=<value> | <key> <value> #配置环境变量,注意此配置会在container中生效。前一种可以一行声明多个环境变量,后一种一行一个。
- ARG <key>[=<value>] #变量,此变量的声明周期与dockerfile构建过程一致,不会在container中生效。可以通过build时添加--build-arg <key>=<value>进行覆盖。注意:ARG时唯一可以放到FROM之前的指令,当ARG放到FROM之前时,它的作用于只到FROM这一行。
- COPY src dest # 将src代表的文件或者文件夹拷贝到dest代表的目录下。src支持通配符* ?
- ADD src dest #将src代表的文件或者文件夹或者网络资源 拷贝到 dest代表的base-image的目录下。src支持通配符 * ?
- RUN command #docker deamon在构建新的镜像时,是通过先基于FROM的镜像开启一个container,然后在这个container里执行。RUN指令就是是你想在container中执行的command。
- ENTRYPOINT ["executable", "param1", "param2"] | command param1 param2 # 将镜像变成一个executable。推荐用CMD来代替。
- CMD ["executable", "param1", "parama2"] | ["param1", "param2"] | command param1 param2 # 最后有一个CMD指令才有效,它代表这个image被用来创建container成功后执行的命令。第二种形式需要个ENTRYPOINT指令结合使用。
- LABEL <key>=<value> <key>=<value> #代表着这个image的元信息,比如此image的描述,版本,作者信息等等。
- EXPOSE port[/protocol] #通过这个image启动的container将会监听这些端口。但是注意这个只是在container内部监听的端口,当你想通过主机访问时需要在启动container时用-p这进行映射。
- USER <user>[:<group>] | <UID>[:<GID>] #在这个指令之后的操作,以及运行container时,指定为此用户。
- WORKDIR /path #在此指令之后的操作,以及container的默认进入路径都将时 /path目录。
- VOLUME ['/path1', '/path2'] #基于此镜像创建的container都将拥有VOLUME中指定的挂在目录。注意映射的主机目录无法指定,有docker deamon自动生成,可以通过docker inspect查看Mounts属性。
2. Dockerfile编写优化
1. 一个docker image只负责一个职责。当有多个服务时,请将服务分别docker化,然后组合使用这些docker images。
2. 就像编程一样,当一个字符串出现多次时,请用ARG来声明变量取代hard code。
3. 拷贝文件到镜像时,ADD负责网络资源的拷贝,COPY负责本地文件的COPY。
4. 尽量使用cache,docker在build镜像时可以利用缓存,缓存的原则时:当重复构建时,如果单个指令的内容没有变化,则docker会默认使用cache。
5. 将相同变化频率的RUN指令合并成一个。注意,一定要是相同变化频率的RUN命令才能合并成一个,不然缓存的特性就无法使用了。
6. 合理使用.dockerignore,减少images的体积。
7. 尽量使用CMD,VOLUME将image进行服务化。
8. 使用LABEL对image进行元信息的描述。
9. 单一服务的基础镜像如何可以请使用alpine版本的镜像来减少image的体积。
Dockerfile详解及优化的更多相关文章
- Dockerfile详解
Dockerfile详解 利用Dockerfile文件,可以构建docker的image镜像 命令使用 通过-f参数指定Dockerfile路径,进行构建image docker build -f / ...
- 【转】Dockerfile详解
Dockerfile详解 https://blog.csdn.net/wo18237095579/article/details/80540571 --------------------- 作者:大 ...
- JS中的函数节流throttle详解和优化
JS中的函数节流throttle详解和优化在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(mousemove),这种事件有一个特点,在一个正常的操作中,有可能在一个短的 ...
- my.cnf 详解与优化【转】
MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用. #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大#T ...
- apache配置文件详解与优化
apache配置文件详解与优化 一.总结 一句话总结:结合apache配置文件中的英文说明和配置详解一起看 1.apache模块配置用的什么标签? IfModule 例如: <IfModule ...
- tomcat常用配置详解和优化方法
tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...
- Tomcat记录-tomcat常用配置详解和优化方法(转载)
常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...
- Dockerfile详解(二)
Dockerfile文件详解 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指 ...
- php详解和优化
nginx结合php使用FastCGI方式 apache结合php,php是作为一个模块加载到apache中 (1)FastCGI工作原理 1.用户发送http请求报文给nginx服务器 2.ngin ...
随机推荐
- HTML+CSS+JavaScript-案例
CSS-flex弹性布局案例1: HTML代码: <!DOCTYPE html> <html lang="en"> <head> <met ...
- 真正可用的安卓webview html图片上传限制突破处理(拍照+相册都可以用)
两篇起步使用webview参考文章,第一篇解除限制,但会调用外部浏览器打开链接,第二篇 覆盖shouldOverrideUrlLoading return true https://www.jb51. ...
- Azure架构(一):云计算基础
云计算的定义 云计算(英语:cloud computing),是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给使用各种计算终端(桌面电脑.笔记本电脑.平板电脑.手机等) ...
- 软件测试第二次作业:初识JUNIT单元测试方法
软件测试有很多分类,从测试的方法上可分为:黑盒测试.白盒测试.静态测试.动态测试 从软件开发的过程分为:单元测试.集成测试.确认测试.验收.回归等. 在众多的分类中,与开发人员关系最紧密的莫过于单 ...
- 框架的一些bug问题记录
关于java后台生成的mis表,在添加的add页面和edit页面中无法显示,去控制台里面查看.会有些错误的信息,是由于,你的那些html的标签不正常.导致无法显示. 里面有一个高级搜索,可以对这个选择 ...
- Navicat for MySQL下载安装和破解教程
1.进https://navicatformysql.en.softonic.com/官网 2.第二步 3.第三步等待下载完成 4.第四步双击 二,破解 1.链接:https://pan.baidu. ...
- python数据类型之元组类型
#为何要有元组,存放多个值,元组不可变,更多的是用来做查询 t=(1,[1,2,3],'a',(1,2)) #t=tuple((1,[1,2,3],'a',(1,2))) # print(type(t ...
- 灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟? 历史进入2019年,放眼望去,今天的整个技术大环境和生态都发生了很大的变化.在己亥猪年春节刚刚过去的早春时节,我们来梳理和展望一下整个 ...
- oracle - 查询某些表是空白,需要提升权限后,才可查询出数据
begin fnd_global.apps_initialize(user_id => 1150 ,resp_id => 50738 ,resp_appl_id => 660 ); ...
- ngx-admin with Asp.net Core 2.0, possibly plus OrchardCore
1 Download ngx-admin from https://github.com/akveo/ngx-admin 2 Create a new Web Application in vs201 ...