Docker学习笔记之Dockerfile
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的更多相关文章
- Docker学习笔记三 Dockerfile 指令 定制镜像
本文地址:https://www.cnblogs.com/veinyin/p/10412079.html 镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...
- docker学习笔记1 -- 安装和配置
技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...
- docker~学习笔记索引
回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...
- Docker学习笔记总结
Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/ 一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...
- Docker学习笔记之-部署.Net Core 3.1项目到Docker容器,并使用Nginx反向代理(CentOS7)(一)
上一节演示如何安装Docker,链接:Docker学习笔记之-在CentOS中安装Docker 本节演示 将.net core 3.1 部署到docker容器当中,并使用 Nginx反向代理,部署平台 ...
- Docker学习笔记之-在CentOS中安装Docker
上一节演示了如何 通过Xshell连接CentOS服务,链接:Docker学习笔记之-通过Xshell连接 CentOS服务 本节将演示 如何在CentOS中安装 Docker 第一步:更新系统包到最 ...
- docker学习笔记(3)- 镜像
简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...
- Docker学习笔记 — 配置国内免费registry mirror
Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...
随机推荐
- apache重写URL时,排除静态资源
THINKPHP项目部署的apache 上面时,如果为了隐藏入口文件配置了重写URL,会导致将静态资源的URL也解析成Controller/Method,导致触发模块不存在 所以在URL重写配置中,需 ...
- Android之window机制token验证
前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Android的Window机制和Co ...
- linux里用户权限:~$,/$,~#,/#的区别与含义
$表明是非root用户登录,#表示是root用户登录,它们是终端shell的命令提示符几种常用终端的命令提示符 BASH: root账户: # ,非root账户: $KSH: root账户: # ...
- maven继承父工程统一版本号
一.建立一个maven工程 pom类型 统一管理依赖以及版本号 子工程不会使用所有的定义的依赖 子工程使用依赖时无需指定版本号 pom.xml <project xmlns="http ...
- Spring Cloud Alibaba基础教程-Nacos(二)
在Spring Cloud Alibaba基础教程-Nacos(一)当中学习了,如何从 nacos当中 通过Java的方式获取值,以及连接数据库,下面我们开始第二篇的学习 ,如果对你有帮助,方便下次寻 ...
- canvas可视化效果之内阴影效果
canvas可视化效果之内阴影效果 楔子 在之前的一个轨道交通可视化项目中,运用到了很多绘制技巧. 可以参考 之前的一篇文章 <利用canvas阴影功能与双线技巧绘制轨道交通大屏项目效果> ...
- ceph如何快速卸载所有osd及擦除磁盘分区表和内容并重新加入
我的ceph集群中有4台服务器,16个osd,因为某些原因,集群中的数据都不要了,但是集群要保留给新的应用使用,集群现有的osd情况如下 [root@ceph-host-01 ~]# cat /etc ...
- java基础: ArrayList集合应用, ArrayList增删改查详解,综合java基础实现学生管理系统,
1.ArrayList 集合和数组的区别 : 共同点:都是存储数据的容器 不同点:数组的容量是固定的,集合的容量是可变的 1.1 -ArrayList的构造方法和添加方法 public ArrayLi ...
- 前置机器学习(五):30分钟掌握常用Matplitlib用法
Matplotlib 是建立在NumPy基础之上的Python绘图库,是在机器学习中用于数据可视化的工具. 我们在前面的文章讲过NumPy的用法,这里我们就不展开讨论NumPy的相关知识了. Matp ...
- phaser3入门教程-从零开始开发一个打砖块游戏
项目代码 项目代码 体验一下 空格开始,左右箭头控制移动 体验一下 Phaser简介 Phaser是一个HTML5游戏框架.它使用了许多HTML5 API,例如Canvas,WebGL,Audio,G ...