接应上篇,续讲前文。今天咱来聊一下Dockerfile的使用 。

虽然可以通过docker commit命令来手动创建镜像,但是通过Dockerfile文件,可以帮助我们自动创建镜像,并且能够自定义创建过程。本质上,Dockerfile就是一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像,简化了从头到尾的构建流程并极大地简化了部署工作。

使用Dockerfile的优点:

  • 像编程一样构建镜像,支持分层构建及缓存。
  • 可以快速而精确的重新创建镜像以便于维护和升级。
  • 便于持续集成。
  • 可在任何地方快速构建镜像。

一、Dockerfile构建镜像步骤

1、创建Dockerfile文件,名字就是Dockerfile

2、docker build Dockerfile所在路径 -t 镜像名称[:tag]

二、Dockerfile指令

1、FORM

FORM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。

基准镜像可以是任务可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,如果不存在,则会从Docker Hub Registry上拉取所需的镜像文件。

也就是说,任何新建镜像必须基于已有的镜像进行构建。

格式:FROM 镜像名称[:tag]

例如:FROM ngxin

2、MAINTAINER

用于让Dockerfile制作者提供本人的详细信息,此指令位置不限,但推荐放置FROM之后。

格式:MAINTAINER 作者信息

例如:MAINTAINER "lsy"

3、LABLE

为镜像指定标签,会继承基础镜像的LABLE,如果key相同,则覆盖。可替代MAINTANIER使用。

格式:LABLE key1=value1 key2=value2

例如:LABLE author=lsy

4、RUN

指定要运行并捕获到新容器镜像中的命令,包括安装文件、创建文件等,在容器创建过程中执行。

格式 :RUN 指令1 [&& 指令2]

注意:由于Dockerfile中每一个指令都会创建一层,所有层一起构成新的镜像。如果指令过多的话,会变得很臃肿,增加构建时间,所以可以将指令合并执行

例如:RUN mkdir -p /usr/lsy && echo 'this is lsy file' > /usr/lsy/lsy.html

例如下面这个Dockerfile文件:

基于nginx创建一个镜像,并创建/usr/lsy目录并创建lsy.html文件

FROM nginx
MAINTAINER "lsy"
RUN mkdir -p /usr/lsy && echo 'this is lsy file' > /usr/lsy/lsy.html

  

使用命令进行构建

docker build ./ -t my_nginx_1:v1.1

  

可以看到,docker会一层层的进行构建。

启动镜像:

docker run --rm --name my_nginx_1 -it my_nginx_1:v1.1 /bin/bash

  

 

可以看到,容器中确实是执行了RUN指令。

5、COPY

将宿主机的文件或者目录拷贝到容器的文件系统中,需相对于Dockerfile的路径。

格式:COPY <src> <dest>

文件复制准则:

  1. <src>必须是build上下文的相对路径。
  2. <src>是目录的话,则内部文件或子目录会递归复制,但是目录自身不会被复制
  3. 如果指定多个src,则dest必须是一个目录,且必须以/结尾
  4. 目标路径如果不存在,则会自动创建

例如:把Dockerfile同目录的test.html文件拷贝到容器中的/usr/lsy目录中

FROM nginx
MAINTAINER "lsy"
RUN mkdir -p /usr/lsy && echo 'this is lsy file' > /usr/lsy/lsy.html
COPY ./test.html /usr/lsy

  

使用docker build对Dockerfile进行构建:

启动容器查看文件是否已拷贝:

6、ADD

功能与COPY类似,还可以使用url规范从远程位置复制到容器中

格式 :ADD <source> <dest>

例如:ADD ./test.html /usr/lsy

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe

7、WORKDIR

用于为其他Dockerfile指令(如 RUN、CMD)设置一个工作目录,并且还设置用于运行容器映像实例的工作目录。WORKDIR之后的指令都会基于设定的工作目录中运行。

格式:WORKDIR 路径

例如:将/usr/lsy设置为工作目录,然后在目录中创建一个a.html文件

FROM nginx
MAINTAINER "lsy"
RUN mkdir -p /usr/lsy
WORKDIR /usr/lsy
RUN touch a.html

  

使用docker build创建镜像

运行容器查看:

可以看到,进来容器就是在工作目录中,并且目录中有了需要创建的文件。

8、CMD

类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,两者的运行时间不同。

RUN指令运行于 镜像创建过程中,而CMD指令运行于基于Dockerfile构建出的镜像启动一个容器时。

CMD指令的目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止,不过CMD指令可以被docker run的命令行参数所覆盖。

Dockerfile中可以指定多个CMD命令,但只有最后一个才会生效。

格式:CMD <command>

CMD ['<executable>','<param1>','<param2>']

CMD ['<param1>','<param2>']

前两种语法跟RUN一样

第三种是用于为ENTERPOINT指令提供默认参数。

例如:CMD c:\Apache24\bin\httpd.exe -w

CMD ['/bin/bash','-c','c:\Apache24\bin\httpd.exe','-w']

9、ENTERPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。如果有CMD,则CMD的命令被当作参数传递给ENTERPOINT。

不过,docker run命令的--entrypoint选项的参数可以对Dockerfile中的ENTRYPOINT进行覆盖。

Dockerfile中可存在多个 ENTRYPOINT指令,但只有最后一个 才会执行。

格式:ENTRYPOINT <command>

ENTRYPOINT ['<executable>','<param1>','<param2>']

10、ENV

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其他指令所调用。

调用格式为${variable_name}或$variable_name

格式:ENV key1=value1 key2=value2

ENV key value

11、ARG

构建参数,作用于ENV相同,不同的是ARG的参数只在构建镜像的时候起作用,也就是docker build的时候。

格式:ARG k=v

12、EXPOSE

用来指定端口,是容器内的应用可以通过端口与外界交互

作用跟docker run 命令中的 -p 一样

格式:EXPOSE 端口

例如:EXPOSE 80

13、VOLUME

用于在镜像中创建一个挂载点目录,以挂载Docker Host上的卷或其他容器上的卷

如果挂载点目录路径下此前的文件存在,docker run命令会在卷挂载完之后将此前的所有文件 复制到新挂载的卷中。

格式:VOLUME <路径>

VOLUME ["<路径1>", "<路径2>"...]

14、USER

用于执行后续命令的用户和用户组

格式 :USER 用户名[:用户组]

例如:USER root:root

15、HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:HEALTHCHECK [OPTIONS] CMD command

HEALTHCHECK NONE

第一个的功能是在容器内部运行一个命令来检查容器的健康状况

第二个的功能是在基础镜像中取消健康检查命令

[OPTIONS]的选项支持以下三中选项:

--interval=DURATION 两次检查默认的时间间隔为30秒

--timeout=DURATION 健康检查命令运行超时时长,默认30秒

--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

--start-period=DURATION 容器启动后多长时间开始执行,默认是0s

注意:

HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。

CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:

0: success - 表示容器是健康的

1: unhealthy - 表示容器已经不能工作了

2: reserved - 保留值

例如:定时 30s PING一下百度,如果PING失败,则返回1

FROM nginx
MAINTAINER "lsy"
HEALTHCHECK --timeout=3s \
CMD curl -f http://localhost/ || exit 1

  

使用docker build构建镜像

运行容器,查看日志输出:

16、ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

格式 :ONBUILD <其它指令>

17、STOPSIGNAL

当容器退出时给系统发送什么样的指令

格式:STOPSIGNAL 指令

===============================

我是Liusy,一个喜欢健身的程序员。

获取更多干货以及最新消息,请关注公众号:上古伪神

如果对您有帮助,点个关注就是对我最大的支持!!!

一文学会Dockerfile语法的更多相关文章

  1. Dockerfile语法梳理

    Dockerfile语法 我们先来看一下上篇的 Dockerfile #获取base image FROM adoptopenjdk/openjdk8:latest #类似于执行 linux指令 RU ...

  2. 四:(之五)Dockerfile语法梳理和实践

    *5.Dockerfile语法梳理和实践 5.1 尽量使用官方的image作为base image 5.2 metadata:指明作者 版本 描述 5.3 每一条run都能形成一个分层,避免无用分层应 ...

  3. (转)一张图学会Dockerfile

    原文:http://blog.51cto.com/kusorz/1942816 前言 Dockerfile是非常容易学的,和SHELL相比那简单的太多了. Dockerfile是为快速构建docker ...

  4. 一文学会JVM性能优化

    实战性能优化 1 重新认知JVM 之前我们画过一张图,是从Class文件到类装载器,再到运行时数据区的过程,现在咱们把这张图不妨丰富完善一下,展示了JVM的大体物理结构图. 执行引擎:用于执行JVM字 ...

  5. 一文学会 TypeScript 的 82% 常用知识点(下)

    一文学会 TypeScript 的 82% 常用知识点(下) 前端专栏 2019-11-23 18:39:08     都已经 9021 年了,TypeScript(以下简称 TS)作为前端工程师不得 ...

  6. 五分钟学会 Kotlin 语法

    为什么使用Kotlin 项目一期在收尾了终于有时间折腾了,一个多月以来Kotlin从入门到现在,坚持用来开发的切身感受.因为语法与Java的区别挺大的一开始很想放弃,如果不是因为项目在使用,想必很少人 ...

  7. dockerfile 语法

    基本语法格式:INSTRUCTION arguments (指令+参数)不分大小写 注释格式:# 注释 第一个指令必须是FROM,标示使用什么镜像 1.解析器指令 解析器指令是可选的,并且影响处理Do ...

  8. dockerfile语法

    dockerfiles的指令不区分大小写,但约定为全部大写 dockerfiles支持如下语法命令: 1.FROM <image name> 所有的dockerfile都必须以from命令 ...

  9. Dockerfile语法简介

    Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令.Docker通过docker build执行Dockerfile中的一系列命令自动构 ...

  10. DockerFile语法【h】

    DockerFile在我理解就是可以将所需要构建镜像的功能.组件都天前配置好,然后直接生成一个Image,而不是先生成镜像,再通过修改容器的方法来生成最终需要的镜像.   镜像的定值实际上就是定值每一 ...

随机推荐

  1. CSS Font知识整理总结

    1.什么是字体 字体是文字的外在形式,就是文字的风格,是文字的外衣.比如行书.楷书.草书,都是一种字体.同样一个字每个人写起来都会有差异,可以说每个人都有一套潜在的字体库.对于web页面来说,字体就是 ...

  2. DataReader和DataSet的异同

    DataReader:使用时始终占用SqlConnection,在线操作数据库:每次只在内存中加载一条数据,所以占用的内存是很小的:是只进的. 只读的. DataSet:则是将数据一次性加载在内存中. ...

  3. [转]oracle 11g 忘记 默认用户密码

    本文转自:http://blog.csdn.net/huangbiao86/article/details/6595052 首先启动sqlplus 输入用户名:sqlplus / as sysdba ...

  4. PHP中::、-&gt;、self、$this操作符的区别

    在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...

  5. 滑动菜单栏开源项目SlidingMenu的使用

    一.SlidingMenu简介相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了这 ...

  6. HW4.7

    public class Solution { public static void main(String[] args) { double rate = 0.05; double balance ...

  7. CentOS 7下载地址(ISO文件)

    CentOS安装文件有两类(32位和64位),每类下载对应有不同的版本,这些版本适合不同需求的用户.CentOS 7官方下载地址:https://www.centos.org/download/在Ce ...

  8. AtCoder 瞎做

    目录 ARC 058 E - 和風いろはちゃん / Iroha and Haiku 题意 题解 技巧 代码 ARC 059 F - バイナリハック / Unhappy Hacking 题意 题解 技巧 ...

  9. BZOJ4167 : 永远的竹笋采摘

    首先枚举出所有可能成为区间最小差值的点对$(j,i)$. 枚举每个位置作为右端点$i$,假设$a[j]>a[i]$. 找到第一个这样的$j$,那么可以将下一个$a[j]$的范围缩小到$(a[i] ...

  10. ArrayList、Vector、LinkedList的特点和区别

    ArrayList.Vector.LinkedList类均在java.util包中,均为可伸缩数组. 1)ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会 ...