Dockerfile 保留字 简介

 

 

 

 

 

FROM 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是 FROM

MAINTAINERMAINTAINER 指令在 Dockerfile 中已经被弃用。在新版本的 Docker 中,应该使用 LABEL 指令来指定维护者信息。

       指定维护者的信息  格式:MAINTAINET <name>

 LABEL: 给构建的镜像打标签格式:LABEL <key>=<value> <key>=<value> <key>=<value> ...

RUN:用于执行后面跟着的命令行命令。在镜像的构建过程中执行特定的命令,并生成一个中间镜像。比如安装一些软件、配置一些基础环境,可使用\来换行

有以下俩种格式:

RUN <命令行命令>      
有2种格式:
1. shell格式: RUN <命令行命令>
    等同于,在终端操作的 shell 命令。
2.
exec 格式:RUN ["可执行文件", "参数1", "参数2"]
例子:RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

PS:
RUN <command> (shell格式)  
RUN ["executable", "param1", "param2"] (exec格式)

要注意的是:executable是命令,后面的param是参数采用exec格式指令将会被解析成json格式所以不能使用单引号,
并且使用反斜杠也是必须要转移的,这在windows上尤为重要。

 

EXPOSE: 当前容器对外暴露出的端口。

WORKDIR: 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点.

WORKDIR <工作目录路径>

ps:
工作路径就是用户登录到容器中以后,进入的默认目录

 

USER:  用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

USER <用户名>[:<用户组>]
ps: 如果不设置USER的话,默认就是使用root用户,但是如果不想使用默认root用户的话,就需要自己执行用户,比如使用worker用户: USER worker

 

ENV:  设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

 

CMD:指定容器运行时的默认参数,

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:
  1. 指定启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条指令,则最后一条执行。(会被启动时指定的命令覆盖)
  2. 如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。其他的CMD指令会被最后一个CMD指令覆盖。

 

 

ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

ADD 的优点:在执行 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到目标路径。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
说明:

路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径,推荐写成绝对路径
可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
如果把写成一个url,那么ADD就类似于wget命令
// src为一个目录的时候,会自动把目录下的文件复制过去,目录本身不会复制

// 如果src为多个文件,dest一定要是一个目录ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
ADD test relativeDir/
ADD test /relativeDirADD
http://example.com/foobar /

 

COPY

COPY 指令从 复制新文件、目录或远程文件 URL,并将它们添加到路径
可以指定多个 资源,但如果它们是文件或目录,则它们的路径被解析为相对于构建上下文的源
每个 可能包含通配符,匹配将使用 Go 的 filepath.Match 规则完成
<dst>是绝对路径,或相对于 WORKDIR 的路径
COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]


通配符用法:
* 通配符:把所有 hom 开头的文件复制到镜像文件系统的 /mydir/ 目录下 COPY hom* /mydir/ * ? 通配符:?匹配 01 个字符,比如会把 home.txt 文件复制到 /mydir/ 目录下 COPY hom?.txt /mydir/ 注意: <src>路径必须在构建的上下文中:不能添加 ../something 、 /something ,因为docker构建的第一步是将上下文目录(和子目录)发送到 docker 守护进程 # test.txt 是相对路径,相对于构建上下文COPY test.txt /mkdir/ # 错误写法,文件均不在上下文目录中,并不会被找到# 这个找的就是构建上下文的上级目录的 test.txtCOPY ../test.txt /mkdir/ # 这个找的是本机根目录下的 test.txtCOPY /test.txt /mkdir/
<src>是目录,则复制目录的全部内容,不会复制目录本身 COPY dir /mydir/ <dst> 必须是一个目录,并且必须以斜杠/ 结尾 <dst> 不以斜杠结尾,将被视为常规文件,并且 <src>的内容将写入<dst> <dst>不存在时,会自动创建

 

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:

避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

 

ENTRYPOINT

 

 

容器启动时运行的启动命令。

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
与CMD的区别:

ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
如果在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数;
如果CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效 ENTRYPOINT [
"<executeable>","<param1>","<param2>",...]

// 实例:
1、Dockerfile 构建了 nginx:test 镜像FROM nginxENTRYPOINT ["nginx", "-c"]
定参CMD ["/etc/nginx/nginx.conf"]
变参
2、不传参运行,容器内会默认运行以下命令,启动主进程。
$ docker run nginx:test //
nginx -c /etc/nginx/nginx.conf
3、传参运行,容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
$ docker run nginx:test -c /etc/nginx/new.conf
// nginx -c /etc/nginx/new.conf

 

posted @ 2024-04-09 19:07  苹果芒  阅读(2)  评论(0编辑  收藏  举报