Dockerfile创建镜像

Posted

tags:

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

基本结构:

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行

Dockerfile分为四部分:基础镜像信息,维护者信息、镜像操作指令和容器启动时执行的命令


Dockerfile指令说明

  • FROM:指定所创建镜像的基础镜像

  • MAINTAINER:指定维护者信息

  • RUN:运行命令

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

  • LABEL:指定生成镜像的运数据标签信息

  • EXPOSE:声明镜像内服务所监听的端口

  • ENV:指定环境变量

  • ADD:复制指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL,如果为tar文件,会自动加压缩到<dest>路径下

  • COPY:复制本机的<src>路径下的内容到容器中的<dest>路径下,一般情况下推荐是用COPY而不是ADD

  • ENTRYPOINT:指定镜像的默认入口

  • VOLUME:创建数据卷挂载点

  • USER:指定运行容器时的用户名或者UID

  • WORKDIR:配置工作目录

  • ARG:指定镜像内使用的参数(例如版本号信息等)

  • ONBUILD:配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作命令

  • STOPSIGNAL:容器退出的信号值

  • HEALTHCHECK:如何进行健康检查

  • SHELL:指定使用shell时默认的shell类型


FROM

执行所创建镜像使用的基础镜像。如果本地不存在,会从配置Registry地址下载,格式为

FROM <image>

或者

FROM <image>:<tag>

或者

FROM <image>@<digest>

任何Dockerfile中的第一条指令必须为FROM指令。如果同一个Dockerfile创建多个镜像,可以使用多个FROM指令


MAINTAINER

指定维护者信息,格式为MAINTAINER<name>。例如:

MAINTAINER [email protected]

改信息会写入生成镜像的Author属性域中


RUN:

运行指定命令,格式为

RUN <command>

或者

 RUN ["executable", "param1", "param2"]

注意,后一个指令会被解析为Json数组,因此必须使用双引号。

前者默认将在shell终端中运行命令,即/bin/sh -c; 后者则使用exec执行,不会启动shell环境。

指定使用其他终端类型可以通过第二种方式实现,例如:RUN ["/bin/bash", "-c", "echo hello"]。

每条RUN指令将在当前镜像的基础上执行指定的命令,并提交为新的镜像,当命令较长时,可以使用“”来换行,例如:

RUN apt-get update     && apt-get install -y libsnappy-dev zliblg-dev libbz2-dev     && rm -rf /var/cache/apt


CMD:

CMD指令用来指定启动容器时默认执行的命令,它支持三种方式:

CMD ["executable", "param1", "param2"]使用exec执行,是推荐使用的方式
CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用
CDM [“param1”, "paam2"]提供给ENTRYPOINT的默认参数

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


LABLE

LABLE指令用来值得顶生成镜像的元数据标签信息

格式为

LABLE <key>=<value> <key>=<value> <key>=<value>...

例如:

LABLE version="1.0"
LABLE description="This text illustrates  that lable-values can span multiple lines."


EXPOSE:

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

格式为

EXPOSE <port> [<port>...]

例如:

EXPOSE 22 80 8443

注意:改指令只是起到声明作用,并不会完成端口映射。

在启动容器时使用-P,Docker会随机分配一个端口,转发到指定的端口,如果使用-p,则可以具体映射到宿主机本机的某个指定端口上。


ENV:

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

格式为

 ENV <key><value>

或者

ENV <key>=<value>...

例如:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress &&...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

指令指定的环境变量在运行时可以被覆盖掉,如

docker run --env <key>=<value> built_image


ADD:

改命令将复制指定的<src>路径下的内容到容器中的<dest>路径下

格式为

ADD <src> <dest>

其中<src>可以是Dockerfile所在目录的一个相对路径(文件或者目录),也可以是一个URL,

还可以是一个tar文件(如果为tar文件,会自动加压缩到<dest>路径下)。<dest>可以是镜像内的绝对路径,或相对于工作目录<WORKDIR>的相对路径


路径正则格式,如:

ADD *.c /code/


COPY:

格式为

COPY <src> <dest>

复制本地主机的<src>下的内容到镜像中的<dest>下,目录不存在时,会自动创建。路径同样支持正则格式。

当使用本地目录为源目录时,推荐使用COPY









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

Docker 基于Dockerfile创建镜像实践

详解Dockerfile之实战项目

自定义通过Dockerfile创建httpd镜像

如何用Dockerfile创建镜像

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

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