dockerFile指令详解

#--version 1.0
FROM ubuntu:16.04
MAINTAINER Semon
ENV REFRESHED_AT 2020-06-16

RUN apt-get -qq update #该指令运行时会刷新APT报的缓存,用来确保我们使用的安装的每个软件包都更新到最新版本
RUN apt-get update
RUN apt-get install -y nginx 
RUN echo 'Hi I am IN YOUR CONTAINER' \
>/usr/share/nginx/html/index.html


EXPOSE 80

说明:

Dockerfile 由一系列指令和参数组成,每条指令都必须是大写字母且后面跟一个参数
Dockerfile 中的指令会按照顺序从上到下执行,所以需要合理安排指令的顺序
每条指令都会创建一个新的镜像层并对镜像进行提交。
每个Dockerfile 的第一条指令都应该是FROM,
FROM指令指定一个已经存在的镜像,被称为基础镜像
MAINTAINER指令知名作者是谁

ENV指令设置一个名为REFRESHED_AT的环境变量

RUN指令在当前镜像中运行指定命令(如果一个平台不支持shell命令,可以使用下面的方式)、
RUN ["apt-get","install", "-y", "nginx"]

EXPOSE指令告诉Docker容器内的应用程序将会使用指定端口。可以指定多个EXPOSE指令向外公开多个端口。
另外docker并不会自动打开该端口,需要在docker run 的时候-p参数指定


使用docker build 命令构建新镜像 -t 指定标签,没有的话默认是latest
docker build -t="jamtur01/mynginx:v1"

以上是一份demo,根据例子解释了一部分docker命令的意义和用法,下来来介绍一下详细的内容:

Dockerfile指令的基本格式如下:

#Comment
INSTRUCTION arguments

dockerfile中,指令INSTRUCTION 不区分大小写,但是为了和参数区分,建议都大写。dockerfile会顺序执行dockerfile中的指令,第一条指令必须是FROM指令,它用于指定否见镜像的基础镜像。在dockerfile中以#开头的行是注释,而在其他位置出现的#会被当成参数。

Dockerfile中的指令有

FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD

错误的指令会被会略。

  • ENV

格式: ENV <KEY> <VALUE>或者<key>=<value> ...

ENV指令可以魏镜像创建出来的容器声明环境变量。并且在Dockerfile中,ENV指令生命的环境变量会被后面的特定指令解释使用。其他指令使用环境变量是,使用格式为$variable_name或者${cariable_name}。在环境变量前面添加斜杠、可以转义,如:\$foo 或者\${foo}。将会分别转换为$foo和${foo},而不是环境变量所保存的值。另外ONBUILD指令不支持环境替换

  • FROM

格式:FROM <image> 或者FROM <images>:<tag>

FROM指令的功能是为后米娜的指令提供基础镜像,因此一个有效的dockerfile必须以from指令作为第一条费注释性指令。从公共的镜像库中拉取镜像很容易,基础镜像可以选择任何有效镜像,在一个dockefile中,FROM指令可以出现很多次,这样会构建很多个镜像。每个镜像创建完成以后,Docker命令行界面会输出该镜像的ID.若FROM指令中的tag为空,则默认tag是latest.如参数images或tag指定的镜像不存在,则返回错误。

  • COPY

格式: COPY <src> <dest>

COPY指令复制<src>所指向的文件或目录,将它添加到新镜像中,复制的文件和目录在镜像中的路径<dest>。 <src>所指定的源可以有多个,但必须在上下文中,及必须是上下文根目录的相对路径。不能使用形如 COPY ../something /something这样的指令。此外, <src>可以使用通配符指定所有匹配通配符的文件或目录,例如 COPY hom*

<dest>可以是文件或目录。但必须是目录镜像中的绝对路径或者相对WORKDIR的相对路径(workdir即dockerfile中WORKDIR指令指定的路径,用来为其他指令设置工作目录)

  • ADD

格式: ADD <src>  <dest>

ADD 和COPY指令在功能上很相似,都支持复制本地文件到镜像的功能,但是ADD指令还支持其他功能。<src>可以指向一个指向网络文件的URL,若<dest>指向一个目录,则URL必须是完全路径,这样就可以获得该网络文件的文件名,该文件会被添加到<dest>/<filername>

<src>还可以指向一个本地压缩归档文件,该文件在复制到容器重视会被加压提取。

  • RUN

格式1:RUN <command> (shell格式) 这条命令会调用shell程序

格式2:RUN ["executable","param1","param2"] (推荐格式2) 这种格式是直接运行,即使没有shell程序,参数会被当成json子数组被docker解析,所以只能使用双引号,不能使用单引号。

  • CMD

格式1: CMD <command>(shell格式)

格式2:CMD ["executable","param1","param2"] (推荐格式2)

格式3:CMD ["param1","param2"] (为ENTRYPOINT指令提供参数)

注意docker run 命令时指定了命令会覆盖CMD指令中的命令。

  • ENTRYPOINT

格式1:ENTRYPOINT <command>(shell格式)

格式2:ENTRYPOINT  ["executable","param1","param2"] (推荐格式2)

ENTRYPOINT 指令和CMD指令类似,都可以让容器在每次启动时执行相同的命令,但是他们之间又有不同。一个dockerfile中可以有多条ENTRYPOINT 指令,但是只有最后一条ENTRYPOINT 指令有效。另外docker run命令执行时不会覆盖ENTRYPOINT 

  • ONBUILD

格式:ONBUILD [INSTRUCTION]

ONBUILD 指令的功能是添加一个将来要执行的触发器指令到镜像,当该镜像作为FROM指令的参数时,这些触发器指令就会在FROM指令执行时加入到构建过程中。尽管任何指令都可以注册成一个触发器指令,但是ONBUILD指令不能包含ONBUILD指令,并且不会触发FROM和MAINTAINER指令。当需要制作一个基础镜像来构建其他镜像时,ONBUILD是和游泳的。

 

posted @ 2020-06-16 18:06  first_semon  阅读(413)  评论(0编辑  收藏  举报