作用

Dockerfile的内容是一坨可以执行的代码(或者说是指令)(docker的DSL),这些代码使得创建镜像的操作可以复用以及自动化。

指令格式

Dockerfile的指令格式很简单:

INSTRUCTION arguments

指令是不区分大小写的,但是约定为全部大写。

Dockerfile中指令的书写顺序就是它们的执行顺序。

指令

FROM

Dockerfile必须以FROM指令开始,FROM指令指定了基础镜像是什么。也就是基于哪个镜像来制作自己的镜像。

FROM <image name>

image name的格式一般为"image:tag"

MAINTAINER

指定镜像的作者信息:

MAINTAINER <author name>

RUN

在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。

RUN <command>

ADD和COPY

复制文件指令。

ADD <source> <destination>

source可以是URL或者是启动配置上下文中的一个文件。

将文件拷贝到container的文件系统对应的路径

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0

如果文件是可识别的压缩格式,则docker会帮忙解压缩。

  • 如果要ADD本地文件,则本地文件必须在 docker build ,指定的目录下
  • 如果要ADD远程文件,则远程文件必须在 docker build ,指定的目录下。比如:

    docker build github.com/creack/docker-firefox

    docker-firefox目录下必须有Dockerfile和要ADD的文件。

COPY指令功能类似,但是COPY不允许source是URL,同时也不会进行解压。

CMD和ENTRYPOINT

提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD/ENTRYPOINT指令。 使用多个CMD/ENTRYPOINT会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD command param1 param2 (shell form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

区别:

第二种方式会以"/bin/sh -c"形式调用。第三种方式是为ENTRYPOINT指定参数,也就是使用第三种形式时,要有一个ENTRYPOINT指令。

如果在执行docker run时提供了command,且command和CMD中相同(参数可以不同),则会执行command,不执行CMD中的命令(实际含义就是把CMD中传递param覆盖了)。

ENTRYPOINT(An ENTRYPOINT allows you to configure a container that will run as an executable)有两种格式:

ENTRYPOINT ["executable", "param1","param2"] (exec form)
ENTRYPOINT command param1 param2 (shell form)

区别:

第二种(shell form)会屏蔽掉docker run时后面加的命令和CMD里的参数;第一种会把docker run后面的参数或CMD里的参数追加给ENTRYPOINT,docker run后面的参数会覆盖掉CMD里的参数。

例如:

...
ENTRYPOINT ["echo", "param1"]

执行

docker run -it test param2

显示param1 param2

如果是shell form形式,docker run提供的参数就无效。

两者区别

ENTRYPOINT和CMD的不同点在于执行docker run时参数传递方式,CMD指定的命令可以被docker run传递的命令覆盖,例如,如果用CMD指定:

...
CMD ["echo"]

然后运行

docker run CONTAINER_NAME echo foo

那么CMD里指定的echo会被新指定的echo覆盖,所以最终相当于运行echo foo,所以最终打印出的结果就是:

foo

而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖),比如:

...
ENTRYPOINT ["echo"]

然后运行

docker run CONTAINER_NAME echo foo

则CONTAINER_NAME后面的echo foo都作为参数传递给ENTRYPOING里指定的echo命令了,所以相当于执行了

echo "echo foo"

最终打印出的结果就是:

echo foo

另外,在Dockerfile中,ENTRYPOINT指定的参数比运行docker run时指定的参数更靠前,比如:

...
ENTRYPOINT ["echo", "foo"]

执行

docker run CONTAINER_NAME bar

相当于执行了:

echo foo bar

打印出的结果就是:

foo bar

EXPOSE

指定容器在运行时监听的端口。

EXPOSE <port> [<port>...]

该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不使用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤:

  • 首先在Dockerfile使用EXPOSE设置需要映射的容器端口;
  • 然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。

    EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

WORKDIR

切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。

WORKDIR /path/to/workdir

ENV

设置环境变量。

ENV <key> <value>

如果不指定value,表示清除key环境变量。

USER

使用哪个用户跑container:

USER <uid>

VOLUME

授权访问从容器内到主机上的目录。语法如下:

VOLUME ["/data"]

参考文档

Dockerfile reference

Docker入门教程(三)Dockerfile

Docker Dockerfile详解

Docker学习笔记(3)-- 如何使用Dockerfile构建镜像

Dockerfile里指定执行命令用ENTRYPOING和用CMD有何不同?

What is the difference between the COPY and ADD commands in a Dockerfile?

dockerfile简述的更多相关文章

  1. Docker Dockerfile简述

    原文地址:https://www.cnblogs.com/cuimiemie/p/6442677.html 作用 Dockerfile的内容是一坨可以执行的代码(或者说是指令)(docker的DSL) ...

  2. dockerfile 介绍

    Docker简介 Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具.其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖.Docker通过Docker容器, ...

  3. 转 dockerfile 介绍 及 编写

    Docker简介 Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具.其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖.Docker通过Docker容器, ...

  4. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

  5. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  6. 如何用Dockerfile创建镜像

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5181222.html 创建镜像的目的 首先说DockerHub或其它一些镜像仓库已经提供了够多的镜像,有 ...

  7. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  8. Dockerfile初探

    git上的asp.net samples工程已经写好了docker file,内容是如下   //任何dockersfile都要以FORM开头,约定是用大写. FROM microsoft/aspne ...

  9. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

随机推荐

  1. 第29章:MongoDB-索引--全文索引

    ①全文索引 全文索引是用于对长文本检索来使用的,是用正则表达式只能对字符串类型的值进行检索.注意:创建索引是一件比较耗时耗费资源的事情,而全文索引更是耗时更厉害,如果对索引键的内容比较长,需要对内容进 ...

  2. HTML中JavaScript调用方法

    我在写web页面的时候,经常用js实现某些功能,我用的方法有两种: 1.点击调用JavaScript: <button onclick="loadXMLDoc()">b ...

  3. 12-简单认识下margin

    margin margin:外边距的意思.表示边框到最近盒子的距离. /*表示四个方向的外边距离为20px*/ margin: 20px; /*表示盒子向下移动了30px*/ margin-top: ...

  4. [HTML5] 颜色选择器的操作[input type='color'....]

    一.点击事件和获取颜色值 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  5. Django-类视图与中间件

    ------类视图 1.类视图引入 def register(request): """处理注册"""   # 获取请求方法,判断是GET/ ...

  6. 关于windows10的使用

    关于windows10的使用 个人习惯设置 打开我的电脑之后,不是定位到此电脑,而是定位到快速访问. [解决办法] 用win + 箭头 快捷键将窗口靠边之后,另一边出现多个窗口 [解决办法] win ...

  7. (转)转一份在 51testing 上的讨论——如何测试一个门户网站是否可以支持10万用户同时在线?

    转自:http://www.cnblogs.com/jackei/archive/2006/11/16/561846.html 这个帖子的内容比较典型,大家有兴趣可以也思考一下. 先是楼主提出问题: ...

  8. Naive Bayes 笔记

    Naive Bayes (朴素贝叶斯) 属于监督学习算法, 它通过计算测试样本在训练样本各个分类中的概率来确定测试样本所属分类, 取最大概率为其所属分类.  优点  在数据较少的情况下仍然有效,可以处 ...

  9. Huffman 编码压缩算法

    前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...

  10. js加减运算·传参

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...