Docker之dockerfile
一、什么是dockerfile
Docker通过对于在dockerfile中的一系列指令的顺序解析实现自动的Image的构建;
通过使用build命令,根据dockerfile的描述来构建镜像;
build的两种方法:
- 通过源代码路径的方式;
- 通过标准输入流的方式;
通过源代码路径:
- Dockerfile需要放置在项目的根目录位置;
- 在构建的时候,Docker client会把整个Context打包发送到docker Server端,然后由Server端负责build镜像,在构建成功后,会删除Context目录;
- docker build -t {镜像名字}{项目的路径,可以是相对路径}
通过标准输入流:
- 通过标准输入流的方式获取dockerfile的内容;
- client不会打包上传context目录,因此对于一些ADD、COPY等涉及HOST本地文件复制的操作不能够支持;
- docker build -t {镜像名字} -< Dockerfile路径
build cache:
- Dockerfile中的每一个指令执行完毕后,都会提交为一个Image,这样保证了指令间不会有影响;
- docker会尽可能尝试重用之前已经重用之前已经构建的镜像;
- 可以通过在build命令中增加-no-cache的方式来禁用cache
dockerignore:
当选择用源代码路径的方式构建image的时候,通过在根目录下放置.dockerignore文件,来过滤不需要发送到server端的文件
类似于.gitinore的概念
二、Dockerfile指令:
- 只支持docker自己定义的一套指令,不支持自定义
- 大小写不敏感,但是建议全部使用大写
- 根据dockerfile的内容顺序执行
FROM
FROM {base镜像}
必须放在dockerfile的第一行,表示从哪个BaseImage开始构建
MAINTAINER
可选的,用来标示Image作者的地方
RUN
每一个RUN指令都会是在一个新的container里面运行,并提交为一个Image作为下一个RUN的base
一个dockerfile中可以包含多个RUN,按定义顺序执行
RUN支持两种运行方式:
RUN <cmd> 这个会当作/bin/sh -c "cmd"运行
RUN ["executable", "arg1", ....], docker把它当Json的序列来解析,因此必须用双引号,而且executable需要是完整路径;
CMD
CMD的作用是作为执行Container时候的默认行为
当运行Container的时候声明了Command,则不再使用Image中的CMD所定义的命令;
一个dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用;
CMD定义三种方式:
- CMD <cmd> 这个会当作/bin/sh -c "cmd"来执行
- CMD ["executable", "arg1", "arg2"]
- CMD ["arg1", "arg2"], 这个时候CMD作为ENTRYPOINT的参数;
ENTRYPOINT:
ENTPYPOINT的作用是,把整个Container变成了一个可执行文件,这样不能够通过替换CMD的方法来改变创建Container的方式。但是可以通过参数传递的方式影响到Container内部。
每个Dockerfile只能包含一个ENTRYPOINT,多个ENTRYPOINT只有最后一个能有效;
当定义了ENTRYPOINT以后,CMD只能作为参数进行传递;
ENTRYPOINT定义方式:
ENTPYPOINT ["executable", "arg1", "arg2"], 这种定义方式下,CMD可以通过Json序列的方式来定义ENTRYPOINT的参数,可以通过在运行Container的时候通过指定Command的方式传递参数
ENTRYPOINT <cmd>, 当做/bin/sh -c "cmd"运行;
ADD©:
当在源代码构建的方式下,可以通过ADD和COPY的方式,把Host上的文件或者目录复制到Image
ADD©的源必须在context路径下;
当src为网络URL的情况下,ADD指令可以把它下载到Dest的指定位置,这个在任何build的方式下都可以工作;
ENV:
用来设置环境变量,后续的RUN可以使用它所创建的环境变量;
当创建基于该镜像的Container的时候,会自动拥有设置的环境变量;
WORKDIR:
用来指定当前工作目录
当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准;
USER:
指定UID或者username,来决定运行RUN指令的用户
ONBUILD:
ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令;
可以定义多个ONBUILD指令
当下一个镜像B使用镜像A作为Base的时候,在FROM A指令前,会按照顺序执行在构建A时候定义的ONBUILD指令
ONBUILD <DOCKERFILE指令> <Content>
VOLUME:
用来创建一个在Image之外的mount point,用来在多个container之间实现数据共享
运行使用json array的方式定义多个volume
VOLUME ["/var/data1", "/var/data2/"]
或则plain text的情况下定义多个VOLUME指令
Docker之dockerfile的更多相关文章
- Centos7安装Docker 基于Dockerfile 搭建httpd运行环境
Centos7安装Docker 基于Dockerfile 搭建httpd运行环境 docker docker搭建 docker build 本文档完成目标内容如下 使用Docker搭建http服务器一 ...
- docker 13 dockerfile的保留字指令
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...
- docker:Dockerfile构建LNMP平台
docker:Dockerfile构建LNMP平台 1.dockerfile介绍 Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...
- docker之Dockerfile指令介绍
Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...
- Docker、Dockerfile、Docker镜像、容器这些都是什么鸟?
老生常谈,再再再……普及一下: Docker:最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改成Docker. Dockerfile: ...
- Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...
- (转)Docker 基础 : Dockerfile
全文来自 Docker 基础 : Dockerfile Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像.我们会先介绍 Dockerfile 的 ...
- 【docker】Dockerfile
[docker]Dockerfile 转载: ============================================================= =============== ...
- Docker 0x05: Dockerfile制作镜像
目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...
- docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像
docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...
随机推荐
- FAQ:Python 断点调试
Python程序调试:断点调试是必须有的功能,以Pycharm开发工具为例: 一.理论知识: 1. step into(F7)就是单步执行,遇到子函数就进入并且继续单步执行: 2 step over ...
- PHP面向对象编程学习之对象基础
php虽然是一门学习起来非常简单的语言,但是这门语言也包含了对面向对象编程的支持.尤其是随着php5的发布,php对面向对象的支持有了很大的进步.最近学习了一下php的面向对象编程,不禁感慨,面向对象 ...
- CSS转载
原文地址:http://www.cnblogs.com/dolphinX/archive/2012/10/13/2722501.html 页面布局,或者是在页面上做些小效果的时候经常会用到 displ ...
- 十九、Android Activity初探
原文:十九.Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供 ...
- rsyslog 日志格式和输出
日志格式: $EscapeControlCharactersOnReceive off #关闭rsyslog默认转译ASCII<32的所有怪异字符,包括换行符等 $template nginx- ...
- Make Hadoop 1.2.1 run, my first try
经历两天努力,8月25日下午2点40分,终于让hadoop1.2.1跑起来. 用的是<Hadoop实战第2版>(陆嘉恒)里面的WordCount例子,虽然书是2013年出的,但用的例子还是 ...
- 字符串匹配——KMP算法
关于KMP算法的分析,我觉得这两篇博客写的不错: http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html ht ...
- SQL语句一些特殊的用法
SQL语句一些特殊的用法 一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份s ...
- SQL学习之使用常用函数处理数据
一.在介绍使用函数处理数据前,先说下使用DBMS(数据库管理系统)处理数据所带来的问题! 1.与几乎所有的DBMS都同等的支持SQL语句(如SELECT)不同,每一个DBMS都有特定的函数,事实上,只 ...
- Win32下C++遍历目录和文件的源码
#include<windows.h> #include<iostream> #include<string> using namespace std; //只能处 ...