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 创建一个容器?