Dockerfile是一个文本文件,记录了镜像构建的所有步骤。

饭提示:学习Dockerfile构建镜像,就是在学习Dockerfile文件构建的命令+shell脚本语句

Dockerfile简单介绍

  Docker可以使用Dockerfile的内容来自动构建镜像。Dockerfile是一个文件,其中有创建镜像、运行指令等一系列的命令,且每行只支持一个运行命令。

Docker file分为四部分组成:

  基础镜像信

  维护者信息

  镜像操作指令

  容器启动时执行指令

  dockerfile指令忽略大小写,建议大写,#作为注释,每行只支持一条指令,指令可以带多个参数。

dockerfile指令有:

  构建指令:用于构建image,其指定的操作不会在运行image的容器中执行。

  设置指令:用于设置image的属性,其指定的操作会在运行image的容器中执行。

Dockerfile指令

Dockerfile指令一共有以下种:

1、FROM

  用来指定基础镜像,然后通过在基础镜像上构建新的镜像,基础镜像一般有远程或本地仓库。并且Dockerfile文件第一行必须的FROM指令,如果一个Dockerfile需要创建多个镜像,可以使用多个FROM指令。

#具体使用用法如下:

  FROM < image_name >   #默认是latest版本

  FROM <image:version>  #指定版本

eg:

FROM mysql:5.6

2、MAINTAINER

  指定镜像的创建者信息

#具体使用法如下:

  MAINTAINER < name >

eg:

MAINTAINER fanfan

3、RUN

  运行所有基础镜像能支持的命令,同样也可以使用多条RUN指令,可以使用\来换行

#具体使用法如下:

 备注:# 由shell启动,Linux默认为`/bin/sh -c`,Windows默认为`cmd /S /C`

  RUN < command >                   #shell启动

  RUN ["executable", "param1", "param2" ... ] (exec form)

eg:

RUN yum -y update

RUN ["/etc/execfile", "arg1", "arg1"]

4、CMD

  用于容器启动时的指定操作,它可以是命令,也可以是脚本,但只执行一次,如果有多个,默认只会执行最后一个。

#具体使用法如下:

  CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐

  CMD command param1 param2,在/bin/sh上执行

  CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。

eg:

CMD echo "This is a test." | wc -

CMD ["/usr/bin/wc","--help"]

5、EXPOSE

  指定容器的端口映射(容器与物理机),运行容器时加上-p参数指定EXPOSE设置的端口。EXPOSE可以设置多个端口号,相应地运行容器配套多次使用-p参数。可以通过docker port +容器需要映射的端口号和容器ID来参考宿主机的映射端口。

#具体使用法如下:

  EXPOSE <port> [port1 , port2 ............]

eg:

EXPOSE 80 443

EXPOSE 8080

例如-p 3307:3306将容器内的3306绑定到本机的3307

6、ENV

  在镜像中用于设置环境变量的,然后RUN命令可以使用此设置的环境变量,在容器启动后也以通过docker inspect查看环境变量,可以通过docker run --env key=value来设置或修改环境变量。

#具体使用法如下:

  ENV <key> <value>

  ENV <key>=<value> ...

eg:

ENV JAVA_HOME /usr/local/jdk

ENV myName="John Doe"

myDog=Rex\ The\ Dog \

myCat=fluffy

等同于

ENV myName John Doe

ENV myDog Rex The Dog

ENV myCat fluffy

7、ADD

  (1)、复制指定的源文件、目录、URL到容器的指定目录中。所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0。

  (2)、如果源是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;

  (3)、如果源文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);

    identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压。

  (4)、如果源是文件且目标目录中不使用斜杠结束,则会将目标目录视为文件,源的内容会写入目标目录;饭:可以理解成目标目录变为文件了。

  (5)、如果源是文件且目标目录中使用斜杠结束,则会源文件拷贝到目标目录下。

#具体使用法如下:

  ADD <> <目标>

eg:

ADD hom* /mydir/ # 添加所有以"hom"开头的文件

ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"

ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/

ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

ADD test /absoluteDir  # 添加 "test" 到 / 下,并重命名为absoluteDir

8、COPY(同ADD,只是不会解压文件)

  复制本地主机的源(默认为Dockerfile所在的目录)到容器中的目标中,目标路径不存在时会自动创建。

#具体使用法如下:

  COPY <源> <目标>

  COPY web/index.html  /var/web/

  路径必须是绝对路径,如果不存在,会自动创建对应目录

  路径必须是Dockerfile 所在路径的相对路径

  如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制

9、ENTRYPOINT

  指定容器启动后执行的命令,多行只执行最后一行。并且不可被docker run提供的参数覆盖。

#具体使用法如下:

  ENTRYPOINT "command" "param1" "param2"  (shell内部命令)

  ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)

eg:

FROM ubuntu

ENTRYPOINT ["top", "-b"]

CMD ["-c"]

当启动容器后,你将直接看到相当于运行了top -b -c

要进一步查看,你可以直接使用命令docker exec -it test ps aux

相当于使用了docker exec top -b -it test ps aux

10、VOLUME

  创建一个可以从本地主机或其它容器挂载的挂载点,一般用于存放数据。与docker run -v也可以实现此功能。

  例如-v ~/opt/data/mysql:/var/lib/mysql将本机的~/opt/data/mysql和容器内的/var/lib/mysql做持久化关联

  容器启动时会加载,容器关闭后会回写。

#具体使用法如下:

  VOLUME  [directory_name]

eg:

VOLUME ["/data"]

VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

11、USER

  指定容器运行时使用的用户或UID,后面RUN、CMD、ENTRYPIONT都会使用此用户来运行命令。

#具体使用法如下:

  USER [username/uid]

eg:

USER 123 或 USER git

12、WORKDIR

  指定RUN、CMD、ENTRYPIONT指定的命令的运行目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR  /data WORKDIR work。最终的路径就是/data/work。path路径也可以是环境变量。

#具体使用方法如下:

  WORKDIR [path]

eg:

WORKDIR /a (这时工作目录为/a)

WORKDIR b (这时工作目录为/a/b)

WORKDIR c (这时工作目录为/a/b/c)

13、ONBUILD

  配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。

#具体使用法如下:

  ONBUILD [INSTRUCTION]

14、LABEL

  给镜像添加信息。使用docker inspect可查看镜像的相关信息

  LABEL "com.example.vendor"="ACME Incorporated"

  LABEL
com.example.label-with-value="foo"

  LABEL version="1.0"

  LABEL description="This text
illustrates \

  that label-values can span multiple lines."

当你在命令行执行docker
inspect name时,会发现时key velue键值对类型的。

15、ARG

  由外部启动时必须传入的参数,在容器启动时用--build-arg传递参数

  指定于外界交互的端口,在容器启动时用-p传递参数

  例如--build-arg
CONT_IMG_VER=v2.0.1

eg:

FROM ubuntu

ARG CONT_IMG_VER

ENV CONT_IMG_VER
${CONT_IMG_VER:-v1.0.0}

RUN echo $CONT_IMG_VER

  有些默认参数,无需指定,也不用使用``传递,可直接传参

  HTTP_PROXY

  http_proxy

  HTTPS_PROXY

  https_proxy

  FTP_PROXY

  ftp_proxy

  NO_PROXY

  no_proxy

(干货)构建镜像之Dockerfile的更多相关文章

  1. (干货)构建镜像之docker commit

    Docker提供了两种构建镜像的方法:docker commit命令喝Dockerfile构建文件. docker commit   不推荐 (1).这是手工构建镜像的方式,容易出错,效率低且可重复性 ...

  2. docker入门——构建镜像

    前面我们已经介绍了如何拉取已经构建好的带有定制内容的Docker镜像,那么如何构建自己的镜像呢? 构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker buil ...

  3. docker之构建镜像

    构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker build命令和 Dockerfile 文件. 在这里并不推荐使用docker commit来构建镜像,而 ...

  4. Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)

    Dockerfile 是一个文本文件,记录了镜像构建的所有步骤. 第一个 Dockerfile 用 Dockerfile 创建上节的 ubuntu-with-vi,其内容则为: 下面我们运行 dock ...

  5. 使用Dockerfile构建镜像-Docker for Web Developers(5)

    1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...

  6. docker(四) 使用Dockerfile构建镜像

    下面以一个例子来演示构建镜像的过程. #在/tmp目录下演示 cd tmp mkdir build-redis-image 1.创建Dockerfile文件 vim Dockerfile 并写入如下内 ...

  7. Docker:dockerfile自动构建镜像 [六]

    一.手动docker镜像的缺点 相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点: 1.dockerfile只有几kb,便于传输 2.使用dockerfile构建出来的镜 ...

  8. Docker系列(三)Dockerfile 离线构建镜像

    一.Dockfile介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfil ...

  9. 使用Dockerfile来构建镜像

    Dockerfile原理 创建Dockerfile Dockerfile实例 Dockerfile指令 注释 FROM MAINTAINER RUN ADD WORKDIR ENV USER COPY ...

随机推荐

  1. linux之DNS服务

    1.DNS (Domain Name Service 域名解析) DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网而不需要记忆能够直接被机器识别的IP. BI ...

  2. 基于gin的golang web开发:集成swagger

    在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...

  3. redhat-DHCP服务的配置与应用

    DHCP服务器为客户端提供自动分配IP地址的服务,减轻网管的负担 首先 rpm -q dhcp 查看是否安装dhcp yum -y install dhcp进行安装 安装完成 dhcp服务配置 dhc ...

  4. python-基础入门-6快速入门总结

    快速入门 程序输出: 1.print语句,字符串用双引号括起来 _在解释器中表示最后一个表达式的值. print语句 与字符串格式(%)结合使用,能实现字符串替换功能. >>>pri ...

  5. 修改pycharm中的flask项目名遇到的坑

    曾修改过自己的项目名,并在settings中的解释器也更正过来了.然后执行pip list 报错: failed to create process. 解决方法如下: 到你的项目的venv目录下的Sc ...

  6. Vegas视频的音频叠加效果怎么实现,可以用其他软件吗

    有时我们会用Vegas为某段影片配音,我们要怎么把配音和背景声融合在一起呢?想必马上会有人反应过来:让配音和背景声分别置于两条轨道上就好了.这当然是一个相当好的方式. 可是,如果我想要把两段音频合成一 ...

  7. 详解在Word文档中常见的各种公式编辑问题

    正常情况下,我们在安装完成MathType之后会直接加载在Word文档中,Word文档中的MathType比较复杂,新手操作遇到麻烦也是常有的事,今天就来给大家详解下Word文档中常见的MathTyp ...

  8. mongodb分页查询,排序

    mongodb代码 根据时间倒序,查看10条 db.表名.find({"_id":"xxx"}).sort({"inserted":-1}) ...

  9. 精尽MyBatis源码分析 - 插件机制

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  10. C语言讲义——注释

    注释 什么是注释?  --注释写在代码中的文字,不参与代码编译,不影响运行结果. 为什么要注释?--让代码可读性更强. C语言有两种注释: 单行注释 // 多行注释 /* */ 多行注释可以只有一行, ...