dockerfile语法规则
编写Dockerfile
在前面的章节,我们学习了通过docker
命令来下载镜像,运行镜像,在容器中部署自己的程序,最后将容器提交到自己的镜像中。但是,这并不是Docker推荐的镜像构建方式。在这一章中,我们将学习如何通过编写Dockerfile脚本来构建和维护镜像。
学习boot2docker的Dockerfles
在安装Docker时,我们提到Docker的Windows安装包boot2docker就是在Docker环境下编译的。下面我们就通过boot2docker的Dockerfile脚本来初步了解Dockerfile的基础知识。
FROM
指令和MAINTAINER
指令
脚本的第1行是FROM
指令。通过FROM
指令,docker
编译程序能够知道在哪个基础镜像执行来进行编译。所有的Dockerfile都必须以FROM
指令开始。第二条指令MAINTAINER
,用来标明这个镜像的维护者信息。
RUN
指令
接下来是RUN
指令。这条指令用来在docker
的编译环境中运行指定命令。上面这条指令会在编译环境运行/bin/sh -c "apt-get update && apt-get -y install ..."
。RUN
指令还有另外一种格式:
RUN ["程序名", "参数1", "参数2"]
这种格式运行程序,可以免除运行/bin/sh
的消耗。这种格式使用Json格式将程序名与所需参数组成一个字符串数组,所以如果参数中有引号等特殊字符,需要进行转义。
ENV
指令
ENV
指令用来指定在执行docker run
命令运行镜像时,自动设置的环境变量。这些环境变量可以通过docker run
命令的--evn
参数来进行修改。
COPY
指令和ADD
指令
COPY
指令用来将本地(Dockerfile所在位置)的文件或文件夹复制到编译环境的指定路径下。上面的例子里,boot2docker的Dockerfile希望将与Dockerfile同一目录下的kernel_config
文件复制到编译环境的/linux-kernal/.config
。Dockerfile还提供了另外一个类似的指令:ADD
。在复制文件方面ADD
指令和COPY
指令的格式和效果是完全一样的。这两个指令的区别主要由两点:
ADD
指令可以从一个URL地址下载内容复制到容器的文件系统中;ADD
指令会将压缩打包格式的文件解开后复制到指定位置,而COPY
指令只做复制操作。
CMD
指令
这是整个Dockerfile脚本的最后一条指令。当Dockerfile已经完成了所有环境的安装与配置,通过CMD
指令来指示docker run
命令运行镜像时要执行的命令。上面的例子里,在完成所有工作后,boot2docker的编译脚本将编译结果输出到本地环境下。
其他指令
上面我们通过boot2docker的Dockerfile脚本学习了几个最常用的指令。接下来我们再学习剩下的几个指令。
EXPOSE
指令
EXPOSE <端口> [<端口>...]
指令用于标明,这个镜像中的应用将会侦听某个端口,并且希望能将这个端口映射到主机的网络界面上。但是,为了安全,docker run
命令如果没有带上响应的端口映射参数,docker
并不会将端口映射出了。
ENTRYPOINT
指令
ENTRYPOINT
指令和前面介绍过的CMD
一样,用于标明一个镜像作为容器运行时,最后要执行的程序或命令。这两个指令有相同之处,也有区别。通过两个指令的配合使用可以配置出不同的效果。
ENTRYPOINT
指令有两种格式,CMD
指令有三种格式:
ENTRYPOINT ["程序名", "参数1", "参数2"]
ENTRYPOINT 命令 参数1 参数2
CMD ["程序名", "参数1", "参数2"]
CMD 命令 参数1 参数2
CMD 参数1 参数2
ENTRYPOINT
是容器运行程序的入口。也就是说,在docker run
命令中指定的命令都将作为参数提供给ENTRYPOINT
指定的程序。同样,上面列举的CMD
指令格式的后面两种格式也将作为参数提供给ENTRYPOINT
指定的程序。
默认的ENTRYPOINT
是/bin/sh -c
。你可以根据实际需要任意设置。但是如果在一个Dockerfile中出现了多个ENTRYPOINT
指令,那么,只有最后一个ENTRYPOINT
指令是起效的。
一种常用的设置是将命令与必要参数设置到ENTRYPOINT
中,而运行时只提供其他选项。例如:你有一个MySQL的客户端程序运行在容器中,而客户端所需要的主机地址、用户名和密码你不希望每次都输入,你就可以将ENTRYPOINT
设置成:ENTRYPOINT mysql -u <用户名> -p <密码> -h <主机名>
。而你运行时,只需要指定数据库名。
VOLUME
指令
VOLUME ["路径"]
VOLUME
指令用于在容器内创建一个或多个卷。而更多的时候,是在执行docker run
时指定要创建的卷以及本地路径来进行映射。关于这个用法将在后面的章节学习到。
USER
指令
USER 用户名或用户ID
USER
指令用于容器内运行RUN
指令或CMD
指令的用户。例如,在构建一个nginx镜像时,你希望最后运行nginx的用户为nginx,就可以在CMD ["nginx"]
之前将用户设置为nginx
。
如果在运行docker run
命令时设置了-u 用户名
参数,那么将覆盖USER
指令设置的用户。
WORKDIR
指令
WORKDIR 路径
WORKDIR
指令用于设置执行RUN
指令、CMD
指令和ENTRYPOINT
指令执行时的工作目录。在Dockerfile中可以多次设置WORKDIR
,在每次设置之后的命令将使用新的路径。
ONBUILD
指令
ONBUILD 指令
ONBUILD
指令用于设置一些指令,当本镜像作为基础镜像被其他Dockerfile用FROM
指令引用时,在所有其他指令执行之前先执行这些指令。
dockerfile语法规则的更多相关文章
- docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。
一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...
- JavaScript:声明变量名的语法规则
一.语法规则 1.变量必须使用字母.下划线(_)或者美元符($)开始. 2.然后可以使用任意多个英文字母.数字.下划线(_)或者美元符($)组成. 3.不能使用JS关键词与保留字. 二.示例 var ...
- JSON 语法规则详解
JSON 的语法规则十分简单,无论用何种方法总结都只有数条而已,它参考了 C 语言家族的一些习惯,学习起来并不会感到陌生. 回顾JSON 的五点语法 1)- 数组(Array)用方括号("[ ...
- JavaScript的语法规则
JavaScript的语法规则 JavaScript区分大小写 JavaScript脚本程序须嵌入在HTML文件中 JavaScript脚本程序中不能包含HTML标记代码 每行写一条脚本语句 语句末尾 ...
- XML 语法规则
转摘自:http://www.w3school.com.cn/xml/xml_elements.asp XML 语法规则 XML 文档包含 XML 元素. XML 的语法规则很简单,且很有逻辑.这些规 ...
- PHPCMS标签:PC标签模板语法规则
模板语法规则1.变量表示{$name} 被解析成 <?=$name?>,表示显示变量$name的值,其中的“name”由英文字母.数字和下划线组成首字母必须是英文字母或者下划线. 2.常量 ...
- C++ 语法规则
C++ 中的布尔类型:布尔类型只占用一个bit ,但是如果连续定义多个布尔类型时,编译器可能会多个布尔类型定义在一起.true 编译器用1来表示.false 编译器用0来表示. 将一个其他类型的数 ...
- Jenkins 定时构建语法规则
1.Jenkins自由风格任务定时构建 2.语法规则 定时构建语法 * * * * * 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个 ...
- 良好的JavaScript编码风格(语法规则)
编码风格 1.概述 "编程风格"(programming style)指的是编写代码的样式规则.不同的程序员,往往有不同的编程风格. 有人说,编译器的规范叫做"语法规则& ...
随机推荐
- JZ2440学习笔记之内存设备
通过OM[1:0]选择启动的设备: OM[1:0]=00,地址0对应的是Internal 4K RAM,且Nand的前4K会被复制到这里,得到执行: OM[1:0]=01,地址0对应的是Nor Fla ...
- .babelrc和babel.config.js的相同配置不能合并
项目内部已经有了babel的配置文件babel.config.js module.exports = { presets: ["@vue/app"], }; 然后由于要按需引入el ...
- String.StartsWith 方法
startsWith() 方法用于检测字符串是否以指定的前缀开始. 语法 public boolean startsWith(String prefix, int toffset) 或 public ...
- 关于py的思考
1.我希望py课程应该涉及到如何提高编程效率,因为已经c的编程基础,不是特别在意怎么用py,而是在意怎么用得更好 2.基本技能的话,掌握好各类基本函数的用法 3.理论课精讲,实验课独立操作,并把出现的 ...
- linux下 如何切换到root用户
默认安装完成之后并不知道root用户的密码,那么如何应用root权限呢? (1)sudo 命令 xzm@ubuntu:~$ sudo 这样输入当前管理员用户密码就可以得到超级用户的权限.但默认的情况 ...
- 不小心跳进安装Django-redis的坑
为了写缓存这一块,我用pip install django-redis安装Django-redis. 它也把我的Django更新到最新了,我回头看下面的截图才发现的,把我的Django从1.8.2更新 ...
- 单元测试系列之十一:Jmockit之mock特性详解
本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...
- Ubuntu 18.04 LTS 常用软件安装杂记
之前个人笔记本装的是 Linux Mint,用了一段时间但是体验不佳,所以打算换成 Ubuntu .作为一个 Linux 小白,当时配置一些软件环境费了不少时间.这次打算简单记录下,和大家分享一下我的 ...
- 如何解决 React 官方脚手架不支持 Less 的问题
说在前面 create-react-app 是由 React 官方提供并推荐使用构建新的 React 单页面应用程序的最佳方式,不过目前版本(1.5.x)其构建的项目中默认是不支持动态样式语言 Les ...
- 【我的前端自学之路】【HTML5】web 存储
以下为自学笔记内容,仅供参考. 转发请保留原文链接:https://www.cnblogs.com/it-dennis/p/10503539.html 什么是Web存储 cookie最大的缺陷是在每一 ...