作用

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. 基础运动move.js

    /* * 事件绑定 */ function myAddEvent(obj,ev,fn){ if(obj.attachEvent){ obj.attachEvent('on' + ev,fn); }el ...

  2. WEB上传大文件解决方案

    众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路.下面贴出简易 ...

  3. RuntimeException

    Throwable Error ... Exception !RuntimeException RuntimeException 两类:checked exceptions 和 unchecked e ...

  4. leaflet入门(五)API翻译(下)

    L.PointConstructor(函数构造器)Properties(属性)Methods(方法) L.BoundsConstructor(函数构造器)Properties(属性)Methods(方 ...

  5. ESP-IDF3.0

    发行版v3.0的文档可在http://esp-idf.readthedocs.io/en/v3.0/上找到. 这是自发布v3.0-rc1以来的更改列表. 如果从以前的稳定版本V2.1进行升级,请检查v ...

  6. js五道经典练习题--第一道

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  7. AngularJS 事件广播与接收 $broadcast,$emit,$on 作用域间通信 封装factory服务 发布订阅

    不同作用域之间通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信. 一.说明 1.广播 $broadcast 说明:将事件从父级作用域传播至本作用域及子级作用域. 格式:$b ...

  8. 转:mysql触发器

    原文地址:http://www.cnblogs.com/nicholas_f/archive/2009/09/22/1572050.html CREATE TRIGGER <触发器名称>  ...

  9. [代码优化]PHP代码优化

    // Code snippet 1 $u_id = Hnb_Session::getInstance()->getUserID(); $arr_joinedTribeInfo = array() ...

  10. vsm安装

    一. 部署环境介绍 软件需求 1) CentOS 6.5 64bit 2) Ceph 0.80.6 网络拓扑介绍 1) Controller Node 由Console节点组成,安装VSM控制平台 2 ...