原文地址:https://www.cnblogs.com/cuimiemie/p/6442677.html

作用

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的文件系统对应的路径

  • 如果要ADD本地文件,则本地文件必须在 docker build
  • 如果要ADD远程文件,则远程文件必须在 docker build

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?

Docker Dockerfile简述的更多相关文章

  1. docker Dockerfile指令ADD和COPY的区别,添加目录方法

    docker Dockerfile指令ADD和COPY的区别,添加目录方法 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中.其格式是: ADD 源 ...

  2. dockerfile简述

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

  3. Docker - Dockerfile - 常见命令简介

    概述 感觉是个 比较重要的东西 有个疑问 我是先讲 docker build 还是 先讲 Dockerfile 穿插讲 docker build 最基本的东西 原理 -t -f docker file ...

  4. [第十二篇]——Docker Dockerfile之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Dockerfile 什么是 Dockerfile? Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 使用 Dockerfile 定制 ...

  5. Docker dockerfile创建Eclipse镜像初试

    抽空初步阅读了Docker技术入门与实战 [Kindle电子书] http://www.cnblogs.com/2018/p/4600116.html 现在想首先在开发环境下引入统一的环境,由于开发中 ...

  6. .Net Core+cenos7+Docker+Dockerfile 部署实践

    因为这段时间比较忙,同时也在抽时间将开发框架转移到 .net Core 上 所以写博客的时间就少了,这次我利用dockerfile成功将.net Core程序部署到了cenos7容器中,特抽时间把我的 ...

  7. Docker Dockerfile详解

    http://blog.csdn.net/wsscy2004/article/details/25878223 如何使用 Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等 ...

  8. Docker Dockerfile COPY vs ADD

    http://blog.163.com/digoal@126/blog/static/163877040201410341236664/   在Dockerfile中, 我们可以使用ADD和COPY拷 ...

  9. docker——Dockerfile创建镜像

    写在前面: 继续docker的学习,昨天用docker成功跑了tomcat,但是在centos中镜像跑的容器手动装jdk和tomcat,今天学习用Dockerfile创建镜像,并在上面搭建java环境 ...

随机推荐

  1. Maven hive-jdbc教程

    由于项目中需要用到hive-jdbc从数据仓库拉数据下来,所以简单的学一下hive,hive数据仓库建构在hadoop集群之上,数据存在hdfs文件系统中,hive中执行的操作会装换成mapreduc ...

  2. [Git] Undo my last commit and split it into two separate ones

    When you accidentally committed some changes to your branch you have various possibilities to “undo” ...

  3. jdbc:initialize-database标签的研究

    在spring的applicationContext.xml中如果引入了:<?xml version="1.0" encoding="UTF-8"?> ...

  4. JavaScript编程(终极篇)

    JavaScript 实现是由以下 3 个不同部分组成的:    核心(ECMAScript)    文档对象模型(DOM)    浏览器对象模型(BOM) 1.数据类型 typeof 运算符 对变量 ...

  5. 手机站CSS

    手机web——自适应网页设计(html/css控制) 内核: -ms- /* IE 9 */ -moz- /* Firefox */ -webkit- /* Safari and Chrome */ ...

  6. ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler

    ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler, 使用<link type="text/css" rel="Stylesheet" ...

  7. [置顶] 单例模式lua实现

    --[[ 优点 一.实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例. 二.灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程. 缺点 一.开销 ...

  8. MDX Step by Step 读书笔记(九) - Working with Time 处理时间

    开篇介绍 这一章节主要用到的 MDX 函数: PeriodsToDate( [Level , [Member]] ) - 从指定级别的范围内,返回与指定成员同一级别,从第一个期间开始到指定成员结束的期 ...

  9. JSP入门实战下

    第一部分简单解说:jsp语法的规范,以及三大编译指令,七个动作指令和九大内置对象,生命周期解说等. 这章主要解说el表达式,核心标签库. 所有代码下载:链接 1.核心标签库(JSTL:c)解说: 1. ...

  10. 官方sakila测试库

    官方sakila测试库 http://downloads.mysql.com/docs/sakila-db.zip