使用Dockerfile建立镜像

Dockerfile是一个文本格式的配置文件python

1  基本结构

dockerfile由一行行命令语句组成,以#开头的是注释行nginx

主体内容分四部分:docker

  •   基础镜像信息
  •   维护者信息
  •   镜像操做指令
  •   容器启动时执行指令

2  指令说明

Dockerfile中指令的通常格式为INSTRUCTION argumentsshell

Dockerfile中的指令及说明数据库

分类ubuntu

指令数组

说明缓存

配置指令安全

ARGruby

定义建立镜像过程当中使用的变量

FROM

指定所建立镜像的基础镜像

LABEL

为生成的镜像添加元数据标签信息

EXPOSE

声明镜像内服务监听的端口

ENV

指定环境变量

ENTRYPOINT

指定镜像的默认入口命令

VOLUME

建立一个数据卷挂载点

USER

指定运行容器时的用户名或UID

WORKDIR

配置工做目录

ONBUILD

建立子镜像时指定自动执行的操做指令

STOPSIGNAL

指定退出的信号值

HEALTHCHECK

配置所启动容器如何进行健康检查

SHELL

指定默认shell类型

操做指令

RUN

运行指定命令

CMD

启动容器时指定默认执行的命令

ADD

添加内容到镜像

COPY

复制内容到镜像

 

2.1  配置指令

1)ARG

定义建立镜像过程当中使用的变量

格式:ARG  <name>[=<default value>]

在执行docker build时,能够经过-build-arg[=]来为变量赋值。当镜像编译成功后,ARG指定的变量将再也不存在(ENV指定的变量将在镜像中保留)

内置变量(不区分大小写):HTTP_PROXY、HTTPS_PORXY、FTP_PROXY、NO_PROXY

 

2)FROM

指定所建立镜像的基础镜像

格式:FROM  <image>  [AS <name>]或FROM  <image>:<tag>  [AS <name>]或

FROM  <image>@<digest>  [AS  <name>]

任何Dockerfile中第一条指令必须为FROM指定,若是在同一个Dockerfile中建立多个镜像时,能够使用多个FROM指定(每一个镜像一次)

例:

ARG VERSION=9.3

FROM debian:${VERSION}

 

3)LABEL

能够为生成的镜像添加元数据标签信息,这些信息能够用来辅助过滤出特定镜像

格式:LABEL  <key>=<value>  <key>=<value>  <key>=<value>...

例:

LABEL version="v1.0"

LABEL author="test" date="2018-12-05"

 

4)EXPOSE

声明镜像内服务监听的端口

格式:EXPOSE  <port>  [<port>/<protocol>...]

只是起到声明做用,并不会自动完成端口映射
例:

EXPOSE  22  80

 

5)ENV

指定环境变量,在镜像生成过程当中会被后续的RUN指定使用,在镜像启动的容器中也会存在

格式:ENV  <key>  <value> 或ENV  <key> =<value>

例:

ENV  VERSION=1.0

指令指定的环境变量在运行时能够被覆盖掉,docker run --env <key>=<value> image

注:当一条ENV指定中同时为多个环境变量赋值而且值也是从环境变量读取时,会为变量都赋值后再更新

例:

ENV  key1=value2

ENV  key1=value1  key2=${key1}

结果:key1=value1  key2=value2

 

6)ENTRYPOINT

指定镜像的默认入口命令,会在启动容器时做为根命令执行,全部传入值做为该命令的参数

两种格式:

  •   ENTRYPOINT  ["executable","param1","param2"]    exec调用指定
  •   ENTRYPOINT  command  param1  param2    shell中执行

  此时,CMD指定指定值将做为根命令的参数

  每一个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效

  运行时,能够被--entrypoint参数覆盖

7)VOLUME

建立一个数据卷挂载点

格式:VOLUME  ["/data"]

运行容器时能够从本地主机或其余容器挂载数据卷,通常用来存放数据库和须要保持的数据等

 

8)USER

指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份

格式:USER  daemon

要临时使用管理员权限能够使用gosu命令

 

9)WORKDIR

为后续的RUN、CMD、ENTRYPOINT指令配置工做目录

格式:WORKDIR  /path/to/workdir

能够使用多个WORKDIR指令,后续命令若是参数是相对路径,则会基于以前命令指定的路径

例:

WORKDIR  /a

WORKDIR  b

RUN  pwd

最终路径为/a/b

 

10)ONBUILD

指定当基于所生成镜像建立子镜像时,自动执行的操做指令

格式:ONBUILD  [INSTRUCTION]
例:

建立父镜像ParentImage中有:

ONBUILD  ADD  .  /app/sec

ONBUILD  RUN  /usr/local/bin/python-build  --dir  /app/src

使用docker build命令建立子镜像ChildImage时(FROM ParentImage),会首先执行ParentImage中配置的ONBUILD指令:

#dockerfile for ChildIMage

FROM ParentImage

因为ONUBILD指令是隐式执行的,推荐在使用它的镜像标签中进行标注,如:ruby:2.1-onbuild;

ONBUILD指令在建立专门用于自动编译、检查等操做的基础镜像时,很是有用

 

11)STOPSIGNAL

指定所建立镜像启动的容器接收退出的信号值

STOPSIGNAL signal

 

12)HEALTHCHECK

配置所启动容器如何进行健康检查(如何判断健康与否)

两种格式:

l  根据所执行命令返回值是否为0来判断

HEALTHCHECK  [OPTIONS]  CMD  command

l  禁止基础镜像中的健康检查

HEALTHCHECK  NONE

 

OPTINOS参数:

l  -interval=DURATION (default:30s)  过多久检查一次

l  -timeout= DURATION (default:30s)  每次检查等待结果的超时

l  -retries=N (default:3)  若是失败了,重试几回才最终肯定失败

 

13SHELL

指定其余命令使用shell时的默认shell类型

SHELL ["executable","parameters"]

 

默认值为["/bin/sh","-c"]

2.2   操做执行

1RUN

运行指定命令

格式:RUN  <command>RUN  ["executable","param1","param2"]

前者默认在shell终端中运行命令;后者指令会被解析为JSON数组,所以必须用双引号,使用exec执行,不会启动shell环境

每条RUN指定将在当前镜像基础上执行指定命令,并提交为新的镜像层

例:

RUN apt-get install -y nginx

RUN ["/bin/bash,"-c","echo hello"]

 

2CMD

用来指定启动容器时默认执行的命令

三种格式:

l  CMD  ["executable","param1","param2"]  至关于执行executable param1 param2,推荐方式

l  CMD command param1 parma2  在默认shell中执行,提供给须要交互的应用

l  CMD ["param1","param2"]  提供给ENTRYPOINT的默认参数

每一个Dockerfile只能有一条CMD命令。若是指定了多条命令,只有最后一条会被执行

 

3ADD

添加内容到镜像,该命令复制指定的<src>路径下内容到容器中的<dest>路径下

格式:ADD  <src>  <dest>

其中<src>能够是Dokcerfile所在目录的一个相对路径(文件或目录);也能够是一个URL;还能够是一个tar文件(自动解压为目录),<dest>能够是镜像内绝对路径,或者相对于工做目录(WORKDIR)的相对路径

路径支持正则格式。例:

ADD  *.C  /code/

 

4COPY

复制内容到镜像

格式:COPY  <src>  <dest>

复制本地主机<src>(为Dockerfile所在目录的相对路径,文件或目录)下内容到镜像中的<dest>。目标路径不存在,会自动建立,一样支持正则格式

 

COPYADD指令功能相似,但使用本地目录为源目录时,推荐使用COPY

3        建立镜像

编写完成Dockerfile后,能够经过docker [image] build命令来建立镜像

格式:docker  build  [OPTIONS]  PATH | URL | -

该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下全部数据做为上下文发送给Docker服务端。Docker服务端在校验Dockerfile格式经过后,逐行执行其中定义的指令,碰到ADDCOPYRUN指令会生成一层新的镜像。若是建立镜像成功,会返回最终镜像的ID

若是上下文过大,会致使发送大量数据给服务端,延缓建立过程。所以除非是生成镜像所必须的文件,否则不要放到上下文路径。

-f:指定使用非上下文路径下的Dockerfile路径

-t:指定生成镜像的标签信息,能够重复使用屡次为镜像一次添加多个名称

例:

docker build -t builder/first_image:1.0.0 /tmp/docker_builder

/tmp/docker_builder上下文路径,builder/first_image:1.0.0标签信息

 

3.1  命令选项

docker [image] build命令选项及说明

选项

说明

--add-host  list

添加自定义的主机名到IP的映射

--build-arg  list

添加建立时的变量

--cache-from  strings

使用指定镜像做为缓存源

--cgroup-parent  string

继承的上层cgroup

--compress

使用gzip来压缩建立上下文数据

--cpu-period  int

分配的CFS调度器时长

--cpu-quota  int

CFS调度器总份额

-c,--cpu-shares  int

CPU权重

--cpuset-cpus  string

CPU容许使用的CPU

--cpuset-mems string

CPU容许使用的内存

--disable-content-trust

不进行镜像校验,默认为真

-f,--file  string

Dockerfile名称

--force-rm

老是删除中间过程的容器

--iidfile string

将镜像ID写入文件

--isolation string

容器的隔离机制

--label list

配置镜像的元数据

-m,--memory bytes

限制使用内存量

--memory-swap bytes

限制内存和缓存的总量

--network string

指定RUN命令时的网络模式

--no-cache

建立镜像时不适用缓存

--platform string

指定平台类型

--pull

老是尝试获取镜像的最新版本

-q,--quiet

不打印建立过程当中的日志信息

--rm

建立成功后自动删除中间过程容器,默认为真

--security-opt strings

指定安全相关的选项

--shm-size bytes

/dev/shm的大小

--squash

将新建立的多层挤压放入到一层中

--stream

持续获取建立的上下文

-t,--tag list

指定镜像的标签列表

--target string

指定建立的目标阶段

--ulimit ulimit

指定ulimit的配置

3.2   选择父镜像

父镜像是生成镜像的基础,会直接影响到所生成镜像的大小和功能

两种父镜像:

l  基础镜像(baseimage: Dockfile中每每不存在FROM指令,或基于scratch镜像(FROM scratch),意味着其在整个镜像树中处于根的位置

例:提早编译好的二进制可执行文件binary复制到镜像中,运行容器时执行binary命令

FROM scratch

ADD binary /

CMD ["/binary"]

普通镜像:由第三方建立,基于基础镜像,常见busyboxdebianubuntu

3.3   使用.dockerignore文件

经过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略匹配路径或文件,在建立镜像时候不将无关数据发送到服务端

例:

#.dockerignore  #注释行

*/temp*

tmp?

!README.md

 

dockerignore文件中支持Golang风格的路径正则格式

* 表示任意多个字符

表明单个字符

 

表示不匹配

3.4   多步骤建立

多步骤建立能够精简最终生成的Docker镜像

对于须要编译的应用一般须要至少两个环境的Docker镜像

l  编译环境镜像:包括完整的编译引擎、依赖库等,每每比较庞大。做用是编译应用为二进制文件

 

l  运行环境镜像:利用编译好的二进制文件,运行应用,因为不须要编译环境,体积比较小

两种格式:

l  根据所执行命令返回值是否为0来判断

HEALTHCHECK  [OPTIONS]  CMD  command

l  禁止基础镜像中的健康检查

HEALTHCHECK  NONE

 

OPTINOS参数:

l  -interval=DURATION (default:30s)  过多久检查一次

l  -timeout= DURATION (default:30s)  每次检查等待结果的超时

l  -retries=N (default:3)  若是失败了,重试几回才最终肯定失败

 

13SHELL

指定其余命令使用shell时的默认shell类型

SHELL ["executable","parameters"]

默认值为["/bin/sh","-c"]

相关文章
相关标签/搜索