接应上篇,续讲前文。今天咱来聊一下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. 一文学会text-justify,orientation,combine文本属性

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  9. dockerfile语法

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

随机推荐

  1. 使用Docker Compose编排Spring Cloud微服务

    文章目录 微服务构建实例 简化Compose的编写 编排高可用的Eureka Server 编排高可用Spring Cloud微服务集群及动态伸缩 微服务项目名称 项目微服务中的角色 microser ...

  2. OpenStack (nova 计算服务)

    nova介绍 Nova 负责维护和管理云环境的计算资源,Nova这个模块很重要,可以说是 OpenStack 的最核心的服务模块之一,以至于在 OpenStack 的初期版本里大部分的云系统管理功能都 ...

  3. for循环实现的一些小例子

    1.1-10阶乘和 package HELLO; public class exercise5 { /** 1-10阶乘和 */ public static void main(String[] ar ...

  4. poj2926Requirements (曼哈顿距离)

    Description An undergraduate student, realizing that he needs to do research to improve his chances ...

  5. codeforces 292E. Copying Data

    We often have to copy large volumes of information. Such operation can take up many computer resourc ...

  6. hdu 01 Matrix

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  7. Codeforces Round #570 (Div. 3) E. Subsequences (easy version) (搜索,STL)

    题意:有一长度为\(n\)的字符串,要求得到\(k\)不同的它的子序列(可以是空串),每个子序列有\(|n|-|t|\)的贡献,求合法情况下的最小贡献. 题解:直接撸个爆搜找出所有子序列然后放到set ...

  8. Kafka官方文档V2.7

    1.开始 1.1 简介 什么是事件流? 事件流相当于人体的中枢神经系统的数字化.它是 "永远在线 "世界的技术基础,在这个世界里,业务越来越多地被软件定义和自动化,软件的用户更是软 ...

  9. spring再学习之配置详解

    applicationContext.xml文件配置: bean元素: <?xml version="1.0" encoding="UTF-8"?> ...

  10. String的20个方法

    String的20个方法 面试题 1.new和不new的区别 String A="OK"; String B="OK";//会去常量池查找有没有"Ok ...