dockerfile创建镜像

Posted Michael2397

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dockerfile创建镜像相关的知识,希望对你有一定的参考价值。

dockerfile用来快速创建自定义镜像

基本结构

dockerfile分为部分:基础镜像信息,维护者信息,镜像操作指令,容器启动时执行指令

一开始必须指明所基于的镜像名称-》维护者信息-》镜像操作指令(RUN)->运行容器时的操作命令(CMD)

指令说明

FROM

 

功能为指定基础镜像,并且必须是第一条指令。

如果不以任何镜像为基础,那么写法为:FROM scratch。

同时意味着接下来所写的指令将作为镜像的第一层开始

 

语法:

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest> 
三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest
RUN

 功能为运行指定的命令

RUN命令有两种格式

1. RUN <command>
2. RUN ["executable", "param1", "param2"]
第一种后边直接跟shell命令

在linux操作系统上默认 /bin/sh -c

在windows操作系统上默认 cmd /S /C

第二种是类似于函数调用。

可将executable理解成为可执行文件,后面就是两个参数。

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

两种写法比对:

RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.

 多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

RUN书写时的换行符是\
CMD

 

功能为容器启动时要运行的命令

语法有三种写法

1. CMD ["executable","param1","param2"]
2. CMD ["param1","param2"]
3. CMD command param1 param2
第三种比较好理解了,就时shell这种执行方式和写法

第一种和第二种其实都是可执行文件加上参数的形式

 

举例说明两种写法:

CMD [ "sh", "-c", "echo $HOME" 
CMD [ "echo", "$HOME" ]
补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。

原因是参数传递后,docker解析的是一个JSON array

每个Dockerfile只能有一个CMD命令。如果指定了多条指令,只有最后一条会被执行
如果用户启动容器时手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令

LABEL

功能是为镜像指定标签

 

语法:

LABEL <key>=<value> <key>=<value> <key>=<value> ...
 一个Dockerfile种可以有多个LABEL,如下:

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."
说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
MAINTAINER

指定作者

语法:

MAINTAINER <name>
EXPOSE

功能为暴漏容器运行时的监听端口给外部

但是EXPOSE只是启动声明作用,并不会使容器访问主机的端口

如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
ENV

功能为设置环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在

语法有两种

1. ENV <key> <value>
2. ENV <key>=<value> ...
两者的区别就是第一种是一次设置一个,第二种是一次设置多个

ADD
一个复制命令,把文件复制到景象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。 语法如下: 1. ADD <src>... <dest> 2. ADD ["<src>",... "<dest>"] <dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径 <src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url 如果把<src>写成一个url,那么ADD就类似于wget命令 如以下写法都是可以的: ADD test relativeDir/ ADD test /relativeDir ADD http://example.com/foobar / 尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据
COPY

看这个名字就知道,又是一个复制命令

语法如下:

1. COPY <src>... <dest>
2. COPY ["<src>",... "<dest>"]
与ADD的区别

COPY的<src>只能是本地文件,其他用法一致

 

以上是关于dockerfile创建镜像的主要内容,如果未能解决你的问题,请参考以下文章

Docker 基于Dockerfile创建镜像实践

详解Dockerfile之实战项目

自定义通过Dockerfile创建httpd镜像

如何用Dockerfile创建镜像

为啥 docker 必须从 dockerfile 创建一个镜像,然后从该镜像创建一个容器,而不是从 Dockerfile 创建一个容器?

47-Docker-Dockerfile镜像创建自动化生产案例