Dockerfile详解
时间:2019-09-06
本文章向大家介绍Dockerfile详解,主要包括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的体积。
原文地址:https://www.cnblogs.com/xiao-xue-di/p/11475027.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Godot游戏开发实践之三:容易被忽视的Resource
- 方便快捷的调试 Node.js 程序
- LeetCode 06Z字形变换&07整数反转
- 对搜索表单提交是否为空进行弹出提示
- PWN入门(Fastbin Attack)
- Qt项目网络聊天室设计
- nginx 端口转发
- linux通用链表
- 什么情况用ArrayList or LinkedList呢?
- Dubbo系列-扬帆起航
- 使用 Horoscope 测试 TiDB 优化器
- 聊聊claudb的importRDB
- 【17期】什么情况用ArrayList or LinkedList呢?
- YOLO V3网络结构解析
- 文献笔记二十一:PhenoGram可视化染色体上的信息