使用Dockerfile创建镜像

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

1  基本结构

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

主体内容分四部分:

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

2  指令说明

Dockerfile中指令的一般格式为INSTRUCTION arguments

Dockerfile中的指令及说明

分类

指令

说明

配置指令

ARG

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

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"]

猜你喜欢

转载自www.cnblogs.com/longBlogs/p/10125916.html