Dockerfile的编写格式为<命令><形式参数>,命令不区分大小写,但一般使用大写字母。Docker会依据Dockerfile文件中编写的命令顺序依次执行命令。Dockerfile文件中,命令总是以FROM开始。如无FROM命令或FROM命令之前有其它命令,则无法创建镜像。此外,各个命令是独立运行的,即使用RUN cd /home 转移目录,也不会对后面的命令产生影响。

  创建镜像时,在Dockerfile所在目录下执行docker build命令。如根据Dockerfile创建一个名为example的镜像:

sudo docker build --tag example . #创建镜像

  1. .dockerignore

  所有与Dockerfile同目录下的文件都称为“上下文”。在创建镜像时,上下文都会被传送到Docker守护进程,所以有必要设置不相关的文件排除在外。如:

>>.dockerignore文件

hello.txt

  2. FROM

  FROM用于设置以哪个镜像为基础镜像。Dockerfile创建的镜像是以已有的镜像为基础的。如下所示:

>>Dockerfile文件

FROM ubuntu:latest

  命令的使用格式为FROM <镜像><标签>或FROM <镜像>。

  3. MAINTAINER

  MAINTAINER用于设置镜像创建者的信息,一般输入名字和邮箱即可。如下所示:

>>Dockerfile文件

MAINTAINER    super lollipop <superlollipop@163.com>

  4. RUN

  RUN用于在FROM中设置的镜像上运行脚本或命令。RUN运行结果会生成新的镜像,运行的详细信息记录到镜像历史。如下所示:

>>Dockerfile文件

RUN apt install -y nginx
RUN echo "hello" >> /tmp/hello.txt

  命令格式为RUN <命令>。

  5. CMD

  CMD用于设置容器启动时运行的脚本或命令,即使用docker run命令创建容器或使用docker start命令启动停止的容器时运行。如下所示:

>>Dockerfile文件

CMD touch /home/hello.txt

  使用格式为CMD <命令>。

  6. ENTRYPOINT

  ENTRYPOINT用于设置容器启动时运行的脚本或命令,即使用docker run命令创建容器或使用docker start命令启动停止的容器时运行,而且ENTRYPOINT只执行一次。如下所示:

>>Dockerfile文件

ENTRYPOINT touch /home/hello.txt

  使用格式为ENTRYPOINT <命令>。

  CMD与ENTRYPOINT的区别:

>>CMD的Dockerfile文件

FROM ubuntu:latest
CMD echo "hello"

  可以看到,如果docker run命令后面附加上了CMD命令后,Dockerfile文件的CMD命令不会被执行。下面再看看ENTRYPOINT命令。

>>ENTRYPOINT的Dockerfile文件

FROM ubuntu:latest
ENTRYPOINT ["echo", "hello"]

  可以看到,后面的echo “world”命令被当成参数执行了Docekerfile里面的ENTRYPOINT设置的echo命令了。相当于在容器启动时执行了echo "hello" "echo" "world"。If the image also specifies an ENTRYPOINT then the CMD or COMMAND get appended as arguments to the ENTRYPOINT.

  注意:如果Dockerfile中有多个CMD或者ENTRYPOINT,只有最后一个CMD或ENTRYPOINT会被执行,CMD和ENTRYPOINT可以组合使用。

  7. EXPOSE

  EXPOSE用于设置与主机相连的端口号,与docker run命令中的 --expose选项功能一致。

>>Dockerfile文件

EXPOSE 80
EXPOSE 443

  使用格式为EXPOSE <端口号>。使用一个EXPOSE也可以设置多个端口号,如上面两行可以换成EXPOSE 80 443。

  注意:EXPOSE只用于与主机进行连接,并不对外暴露。若想将端口暴露在外,需要在docker run命令添加选项-p或-P。

  8. ENV

  ENV用于设置环境变量。使用ENV设置的环境变量应用于RUN、CMD、ENTRYPOINT。如下所示:

>>Dockerfile文件

FROM ubuntu:latest
ENV HELLO 12345
CMD echo ${HELLO}

  

  可以看到CMD echo ${HELLO}输出了ENV设置的变量值12345。

  9. ADD

  ADD用于向镜像添加文件。如下所示:

>>Dockerfile文件

FROM ubuntu:latest
ADD Diagram1.dia.autosave /Diagram1.dia.autosave
ADD apache-tomcat-9.0.24.tar.gz /

  命令格式为ADD <要复制文件的路径> <文件在镜像中的路径>

  可以看到添加到容器内的两个文件,添加的tar.gz文件会被解压。注意:要复制的文件的路径以上下文为基准,即要和Dockerfile在同一文件夹下。除此,<要添加的文件>也可以设置为目录或者网络文件的URL,如ADD hello-dir /hello-dir、ADD http://localhost:8080/apache-tomcat-9.0.24.tar.gz /。

  10. COPY

  COPY用于向镜像添加文件。与ADD不同,使用COPY添加压缩文件时,不会解压缩,也不能使用文件的URL。如下所示:

>>Dockerfile文件

FROM ubuntu:latest
COPY Diagram1.dia.autosave /Diagram1.dia.autosave
COPY apache-tomcat-9.0.24.tar.gz /

  可以看到COPY添加的tar.gz文件并没有被解压添加到容器,而是仅仅添加了压缩包文件到容器。

  11. VOLUME 

  VOLUME设置用于将目录下的内容存储到主机而非容器。如下所示:

>>Dockerfile文件

VOLUME /data
VOLUME ["/data","/var/log/test"]

  使用格式为VOLUME <容器目录>或VOLUME ["容器目录1",“容器目录2”]。但使用VOLUME不能与主机的特定目录相连,若想连接数据卷与主机的特定目录,则必须在docker run命令中使用-v选项。

  12. USER

  USER用于设置运行命令的用户账号,该用户会应用于RUN、CMD、ENTRYPOINT。如下所示:

>>Dockerfike

FROM ubuntu:latest
USER nobody
RUN touch /tmp/hello.txt USER root
RUN touch /hello.txt

  首先以nobody用户在tmp目录下创建hello.txt文件,然后用root用户在/目录下创建hello.txt文件,只有root用户有权限在/目录下创建文件。

  可以看到/tmp/hello.txt文件的用户所有者是nobody。

  13. WORKDIR

  WORKDIR用于设置执行RUN、CMD、ENTRYPOINT命令的目录。

>>Dockerfile

WORKDIR /tmp
RUN touch hello.txt

  使用格式为WORKDIR <路径>。上述Dockerfile会在/tmp目录下创建hello.txt文件。

  14. ONBUILD

  将当前镜像作为基础镜像创建其他镜像时,ONBUILD指定用于设置一些要触发的操作。ONBUILD指定的命令在构建镜像时不会被执行,而是在其子镜像中执行。如下所示:

>>Dockerfile

FROM ubuntu:latest
ONBUILD RUN touch hello.txt

  然后创建镜像并运行容器

  发现并没有执行ONBUILD后的RUN touch hello.txt,然后我修改Docker文件,再以此创建的镜像再次创建镜像exampletest2

>>Dockerfile文件

FROM exampletest1

  

  创建镜像exapletest2后并且运行容器,ONBUILD触发执行了,容器内存在文件hello.txt。

Docker学习笔记之Dockerfile的更多相关文章

  1. Docker学习笔记三 Dockerfile 指令 定制镜像

    本文地址:https://www.cnblogs.com/veinyin/p/10412079.html  镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...

  2. docker学习笔记1 -- 安装和配置

    技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...

  3. docker~学习笔记索引

    回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...

  4. Docker学习笔记总结

    Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/   一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...

  5. Docker学习笔记之-部署.Net Core 3.1项目到Docker容器,并使用Nginx反向代理(CentOS7)(一)

    上一节演示如何安装Docker,链接:Docker学习笔记之-在CentOS中安装Docker 本节演示 将.net core 3.1 部署到docker容器当中,并使用 Nginx反向代理,部署平台 ...

  6. Docker学习笔记之-在CentOS中安装Docker

    上一节演示了如何 通过Xshell连接CentOS服务,链接:Docker学习笔记之-通过Xshell连接 CentOS服务 本节将演示 如何在CentOS中安装 Docker 第一步:更新系统包到最 ...

  7. docker学习笔记(3)- 镜像

    简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...

  8. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  9. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

随机推荐

  1. protobuf 协议浅析

    目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...

  2. ps查看完整程序执行路径

    在linux下查看进程大家都会想到用 ps -ef|grep ***可是看到的不是全路径,怎么看全路径呢?每个进程启动之后在 /proc下面有一个于pid对应的路径例如:ps -ef|grep jav ...

  3. 自己编写k8s

    ## 基于Docker和Kubernetes的企业级DevOps实践训练营 ### 课程准备 1. 离线镜像包 百度:https://pan.baidu.com/s/1N1AYGCYftYGn6L0Q ...

  4. 本地安装yum源脚本

    rpm -qa|grep yum   //检查是否安装了yum. 如果没有安装就执行下面的文件 创建一个以xxx.sh结尾的文件 #!/bin/bash #创建两个文件用于挂载文件 mkdir /mn ...

  5. IDEA中flink程序报错找不到类

    Idea中运行flink程序,报错找不到类,其中pom文件中一项依赖为: <dependency> <groupId>org.apache.flink</groupId& ...

  6. 网站配置Gittalk教程和解决gittalk的Error: Not Found.问题

    想把网站增加gittalk的评论功能,按照其他教程配置后,出现了 Error: Not Found. 的错误.截图如下: 网上找了很多解决方案,现在贴出来完整的配置Gittalk的教程. 01.新建评 ...

  7. vue第十三单元(指令的作用,指令的钩子函数)

    第十三单元(指令的作用,指令的钩子函数) #课程目标 1.了解自定义指令的应用场景 2.掌握自定义全局和局部指令 3.掌握指令的钩子函数 #知识点 #一.认识自定义指令 除了核心功能默认内置的指令 ( ...

  8. [日常摸鱼]51nod1237-最大公约数之和V3-杜教筛

    题意:求$\sum_{i=1}^n \sum_{j=1}^n gcd(i,j),n<=1e10$ 之前刚好在UVA上也做过一个这样求和的题目,不过那个数据范围比较小,一开始用类似的方法 $ans ...

  9. NET 5 使用HttpClient和HttpWebRequest

    HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类.HttpWebRequest是老版本.net下常用的,较为底层且复杂,访问速度及并发也不甚理想,但是使用HttpW ...

  10. webform中按钮触发事件顺序

    执行顺序 先执行js端的方法,后执行后台的方法 一般js端方法用做数据的校验,校验成功 return true;后才执行后台的方法. 示例 <asp:Button runat="ser ...