DockerFile关键字介绍

Dockerfile使用

创建镜像的时候,要在Dockerfile所在的目录使用docker build命令

sudo docker build --tag example
sudo docker build --tag <用户名>/example

--tag或-t选项用于设计镜像名称,弱项将镜像上传到Docker Hub,只需要在/之前添加用户名即可。

Dockerfile的书写规则及指令使用方法

Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释。每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。

  1. 构建指令用于构建image,其指定的操作不会在运行image的容器上执行。
  2. 设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

Dockerfile关键字

FROM(指定基础镜像)

构建指令,Docker中必须使用FROM命令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。
该指令有两种格式:

  1. FROM <镜像>  指定基础镜像为该镜像的最后修改的版本。
    FROM ubuntu
  2. FROM <镜像>:<标签>  指定基础镜像为该镜像的一个标签版本。
    FROM ubuntu:15.10

一个Dockerfile中可以使用多个FROM命令,若设置了两个FROM命令,则创建两个镜像。若使用--tag选项设置了镜像名称,则会应用于最后一个FROM命令。

MAINTAINER(指定镜像创建者信息)

构建指令,用于将image的制作者相关的信息写入到image中,一般输入名字和电子邮箱即可。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
格式:

  1. MAINTAINER <创建者信息>
    MAINTAINER HUi20,<[email protected]>

RUN(安装软件用)

构建指令,在FROM中设置的镜像上运行脚本或命令,在RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。
该指令有两种格式:

  1. RUN <命令>使用shell运行命令
    RUN git clone https://github.com/docker/docker.git
  2. RUN ["<可执行文件>", "<形式参数1>", "<形式参数2>" ... ] 无shell直接运行
    RUN ["/user/local/bin/hello","--help"]

CMD(设置container启动时执行的操作)

设置指令,用于容器启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。

一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.

该指令有三种格式:

  1. CMD ["<可执行文件>","<形式参数1>","<形式参数2>""] 无shell直接运行时设置形式参数
  2. CMD <命令> <形式参数1>,<形式参数2>  用shell运行命令
  3. CMD ["<形式参数1>","<形式参数2>"]  当Dockerfile指定了ENTRYPOINT。

ENTRYPOINT指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序将会以param1和param2作为参数执行。所以如果CMD指令使用上面的形式,那么Dockerfile中必须要有配套的ENTRYPOINT。

ENTRYPOINT(设置container启动时执行的操作)

设置指令,指定容器启动时执行的命令。

但是一个Dockerfile中只能有一条ENTRYPOINT命令,可以多次设置,但是只有最后一个有效。

两种格式:

  1. ENTRYPOINT <命令> 参数1 参数2  用shell运行命令
  2. ENTRYPOINT ["<可执行文件>", "<形式参数1>", "<形式参数2>"]无shell直接运行

ENTRYPONIT可以在docker run命令中使用 -- entrypoint选项进行设置。若设置了 --entrypoint选项,则忽略Dockerfile文件中的ENTRYPONIT

EXPOSE(指定容器需要映射到宿主机器的端口)

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。
格式:

  1. EXPOSE <端口号>

EXPOSE只用于与主机进行连接,并不对外暴露。若想讲端口号暴露在外,需要使用docker run命令的-p、-P选项

ENV(用于设置环境变量)

构建指令,在image中设置一个环境变量。
格式:

  1. ENV <环境变量> <值>  使用环境变量时,要添加$符号

设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量。

也可以通过在docker run --e  <环境变量>=<值>时设置或修改环境变量。

ADD(向镜像添加文件)

构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0。

格式:

  1. ADD <要复制文件的路径> <文件在镜像中的路径>  

src要复制文件的路径

dest文件在镜像中的路径

注意:

  1. <src>以上下文目录为基准,不能使用上下文以外的文件、目录或绝对路径
  2. <src> 可以是Dockerfile所在目录的一个相对路径,也可以是一个URL,还可以是一个tar文件(自动解压为目录)
  3. 如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>
  4. 如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下
  5. <dest> 是容器中的绝对路径
  6. 如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录
  7. 如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式)

ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

COPY(向镜像添加文件)

复制本地主机的 <src> (为Dockerfile所在目录的相对路径)到容器中的 <dest>

使用COPY添加文件时,不会解压缩,也不能使用文件URL

从上面的定义中可获知,src可以是Dockerfile所在目录的一个相对路径,但在实际操作中,只有与Dockerfile文件在同一目录的文件或目录可以成功的使用ADD <src> <dest>

如果文件或目录不与Dockerfile在同一目录会提示 no such file or directory,如:(ADD ../test2 /data/code/nginx),从Dockerfile所在目录通过 cd ../test2可以到达test2

格式:

COPY <要复制文件的路径> <文件在镜像中的路径>

src要复制文件的路径

dest文件在镜像中的路径

注意

  1. <src>以上下文目录为基准,不能使用上下文以外的文件、目录或绝对路径
  2. <src>不仅可以设置为文件,还可以设置为目录。设置为目录时,会复制目录下的所有文件。另外,也可以使用通配符只复制特定文件
  3. <src>不可以设置为网络文件的URL
  4. 压缩文件不会解压缩,直接复制
  5. <dest>必须设置为绝对路径。并且,若路径以/结尾,则创建目录并将文件复制到该目录
  6. 添加当前目录时,.dockerignore文件中设置的文件与目录会被排除在外

VOLUME(指定挂载点))

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。可以将本地文件夹或者其他container的文件夹挂载到container中。
格式:

  1. VOLUME ["<容器目录1>","<容器目录2>"]  
  2. VOLUME <容器目录>

使用VOLUME不能与主机的特定目录进行连接

若想连接数据卷与主机的特定目录,则必须在docker run 命令中使用-v选项。

选项格式为:-v <主机目录>:<容器目录>

USER(设置container容器的用户)

设置指令,设置启动容器的用户,默认是root用户。该用户会应用于RUN、CMD、ENTRYPOINT

格式:

  1. 使用格式为USER<账号用户名>

USER后面的所有RUN、CMD、ENTRYPOINT都会得到应用,中间可以设置其他用户以更换用户

WORKDIR(切换目录)

切换目录用,设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
格式:

  1. WORKDIR <路径>

设置WORKDIR时也可以用相对路径替代绝对路径。若使用相对路径,先要以设置的WORKDIR路径为基准更改目录。最初基准为/

ONBUILD(在子镜像中执行)

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

格式:

  1. ONBUILD <Dockerfile命令><Dockerfile命令的形式参数> 

需要再次创建example镜像后,使用docker run命令才会执行ONBUILD设置的指令

猜你喜欢

转载自blog.csdn.net/weixin_37645838/article/details/83343029
今日推荐