DockerFile 命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_14845119/article/details/83149648

 

FROM :

指定构建使用的基础镜像,并且必须是第一条指令。如果不以任何镜像为基础,那么写法为FROM scratch。

FROM <image>

FROM <image>:<tag>
FROM <image>:<digest>

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

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

例: FROM ubuntu:14.04

 

 

MAINTAINER :

创建者信息

MAINTAINER <author name>

例: MAINTAINER Laowen "[email protected]"

 

 

ARG:

设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数

如果用户在build镜像时指定了一个参数没有定义在Dockerfile,那么将有一个Warning

[Warning] One or more build-args [foo] were not consumed。

如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值

ARG <name>[=<default value>]

例: ARG user1

ARG user1=someuser

 

 

ENV:

设置环境变量

ENV <key> <value>
ENV <key>=<value> ...

两者的区别就是第一种是一次设置一个,第二种是一次设置多个

例: ENV REFRESHED _AT 2017-03-16

 

 

RUN: 

在shell或者exec的环境下执行一条命令.RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果可以用在Dockerfile的下一条指令中

RUN <command>

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

第一种后边直接跟shell命令

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

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

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

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

 

例:RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME

 

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

RUN apt-get -yqq update

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.

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

RUN书写时的换行符是\

 

 

CMD:

提供了容器默认的执行命令,Dockerfile只允许使用一次CMD指令. 使用多个CMD只有最后一个指令生效

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

第三种比较好理解了,就时shell这种执行方式和写法,第一种和第二种其实都是可执行文件加上参数的形式

例: CMD [ "/bin/true" ]

注意:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。

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

 

 

ENTRYPOINT:

配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序.同时也意味着该镜像每次被调用时仅能运行指定的应用.类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会只执行最后的ENTRYPOINT指令

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

例: ENTRYPOINT [ "nodejs", "server.js" ]

 

 

RUN & CMD&ENTRYPOINT

区别:

RUN是构件容器时就运行的命令以及提交运行结果,可以写多条,全部生效

CMD是容器启动时执行的命令,在构件时并不运行,只能写一条,如果写多条,只有最后一条生效,会被运行的command覆盖

ENTRYPOINT是容器启动时执行的命令,在构件时并不运行,只能写一条,如果写多条,只有最后一条生效,不会被运行的command覆盖

联系:

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数

例: FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

例:FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ls -al

 

 

LABEL

功能是为镜像指定标签

LABEL <key>=<value> <key>=<value> <key>=<value> ...

一个Dockerfile种可以有多个LABEL

例:LABEL version="1.0"
LABEL description="This text illustrates

注意:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

 

 

ADD:

从当前目录复制文件到容器, source可以是URL或者是启动配置上下文中的一个文件, destination是容器内的路径。会自动处理目录, 压缩包等情况

ADD <source> <destination>

例: ADD /home/aaa /home/aaa

 

 

COPY:

从当前目录复制文件到容器. 只是单纯地复制文件。

COPY <source> <destination>

例: COPY /home/aaa /home/aaa

注意:COPY的<src>只能是本地文件,其他用法与ADD一致

 

 

VOLUME:

声明一个数据卷, 可用于挂载, []里面是路径,一般的使用场景为需要持久化存储数据时容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。所以当数据需要持久化时用这个命令。

VOLUME [ "/data" ]

例: VOLUME [ "/var/lib/redis", "/var/log/redis" ]

 

USER:

镜像正在运行时设置的一个UID或用户名,RUN命令执行时的用户,如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行

USER<uid>

USER <daemo>

 

 

WORKDIR:

设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。

WORKDIR /path/to/workdir

例: WORKDIR /opt/nodeapp

 

 

ONBUILD:

前缀命令, 放在上面这些命令前面, 表示生成的镜像再次作为"基础镜像"被用于构建时要执行的命令

ONBUILD [INSTRUCTION]

例: ONBUILD RUN ls -al

 

 

STOPSIGNAL

作用是当容器退出时给系统发送什么样的指令

STOPSIGNAL signal

 

 

EXPOSE:

EXPOSE <port>

指定容器在运行时监听的端口,但是EXPOSE并不会使容器访问主机的端口。如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数

例: EXPOSE 3000

 

HEALTHCHECK

容器健康状况检查命令

HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE

第一个的功能是在容器内部运行一个命令来检查容器的健康状况

第二个的功能是在基础镜像中取消健康检查命令

 

[OPTIONS]的选项支持以下三中选项:

    --interval=DURATION 两次检查默认的时间间隔为30秒

    --timeout=DURATION 健康检查命令运行超时时长,默认30秒

    --retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

    

注意:

HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。

 

CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:

0: success - 表示容器是健康的

1: unhealthy - 表示容器已经不能工作了

2: reserved - 保留值

 

例:HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1

  

健康检查命令是:curl -f http://localhost/ || exit 1

两次检查的间隔时间是5秒

命令超时时间为3秒

猜你喜欢

转载自blog.csdn.net/qq_14845119/article/details/83149648