【docker 】Dockerfile指令学习

学习文档地址

上篇文章:【docker 】基于Dockerfile创建镜像

Dockerfile指令文档地址

.dockerignore 文件

Dockerfile指令

常见的指令

Dockerfile 指令 说明
FROM 指定基础镜像,用于后续的指令构建。
MAINTAINER 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL 添加镜像的元数据,使用键值对的形式。
RUN 在构建过程中在镜像中执行命令。
CMD 指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖)
EXPOSE 声明容器运行时监听的特定网络端口。
ENV 在容器内部设置环境变量。
ADD 将文件、目录或远程URL复制到镜像中。
COPY 将文件或目录复制到镜像中。
VOLUME 为容器创建挂载点或声明卷。
WORKDIR 设置后续指令的工作目录。
USER 指定后续指令的用户上下文。
ARG 定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。
ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL 设置发送给容器以退出的系统调用信号。
HEALTHCHECK 定义周期性检查容器健康状态的命令。
SHELL 覆盖Docker中默认的shell,用于RUNCMDENTRYPOINT指令。

注释

指令不区分大小写。然而,惯例是他们要大写,以便更容易地将他们与论点区分开来。

Docker按顺序运行Dockerfile中的指令。Dockerfile必须以FROM指令开头。这可能在解析器指令、注释和全局范围的ARG之后。FROM指令指定要从中构建的父映像。FROM前面只能有一个或多个ARG指令,这些指令声明Dockerfile中FROM行中使用的参数。

Docker 将以开头的行视为#注释,除非该行是有效的 解析器指令。行中其他任何位置的标记#都被视为参数。

【docker 】Dockerfile指令学习_第1张图片

为了向后兼容,注释 ( #) 和指令(例如RUN)之前的前导空格将被忽略,但不鼓励这样做。在这些情况下,不会保留前导空格,因此以下示例是等效的:

示例1:
        # 第一个Dockerfile
    FROM nginx
 
RUN echo "

程序员食堂 的第一个Dockerfile

" >> /usr/share/nginx/html/index.html

指令参数中的空格(例如下面的命令RUN)将被保留

示例2:
# 第一个Dockerfile
FROM nginx
 
RUN echo "

程序员食堂 的第一个Dockerfile

" >> /usr/share/nginx/html/index.html

ENV  环境变量

环境变量官网地址

环境变量(用ENV声明)也可以在某些指令中用作由 Dockerfile. 还可以处理转义以将类似变量的语法按字面意思包含到语句中。

ENV指令将环境变量设置为值 。该值将存在于构建阶段中所有后续指令的环境中,并且 也可以在许多指令中内联替换。该值将被解释为其他环境变量,因此如果不转义引号字符将被删除。与命令行解析一样,引号和反斜杠可用于在值中包含空格。

示例1:
ENV MY_NAME="zhang san  feng"
ENV MY_HOME=wu\ dang\  shan
ENV MY_WORK=KungFuTeacher

ENV指令允许= ...一次设置多个变量,下面的示例将在最终图像中产生相同的最终结果:

示例2:
ENV MY_NAME="zhang san  feng"  MY_HOME=wu\ dang\  shan  MY_WORK="kung fu teacher"

FROM指令

定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。并且必须是第一条指令。

如果不以任何镜像为基础,那么写法为:FROM scratch。

【docker 】Dockerfile指令学习_第2张图片

语法
FROM [image]

FROM [image]:[tag]

FROM [image]:[digest]

 是可选项,如果没有选择,那么默认值为latest

RUN指令

功能为运行指定的命令
RUN命令有两种格式,shell 格式exec 格式

shell 格式:
# [命令行命令] 等同于,在终端操作的 shell 命令。
#  RUN [命令行命令]


RUN echo "

程序员食堂 的第一个Dockerfile

" >> /usr/share/nginx/html/index.html
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]

# nginx-run.sh 是一个执行nginx的脚本

RUN ["./nginx-run.sh", "start"] 等价于 RUN ./nginx-run.sh start

MAINTAINER指令(不推荐)

MAINTAINER指令是维护者信息。

# MAINTAINER 

MAINTAINER chengxuyuanshitang
   

COPY指令

COPY指令,从上下文目录中复制文件或者目录到容器里指定路径,可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。不会自动解压文件,也不能访问网络资源。

# 语法:
OPY [--chown=:] <源路径1>...  <目标路径>
COPY [--chown=:] ["<源路径1>",...  "<目标路径>"]

#示例:

#添加 "test" 到 `WORKDIR` /test/  
COPY test* /test/

# 添加 "test" 到 /test/   
COPY test?.txt /test/

[--chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。

ADD指令

官方推荐使用 COPY。

ADD指令将本地文件添加到容器中。

执行 【源文件】 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 【目标路径】。

在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

可以访问网络资源,类似wget。

# 格式:
ADD <源文件>... <目标路径>
ADD ["<源文件>",... "<目标路径>"] 用于支持包含空格的路径

#示例:

# 添加所有以"test"开头的文件到/test/目录下
ADD test* /test/          

# ? 替代一个单字符,添加所有以"test"开头结尾是一个字符的文件到/test/目录下,例如:"test1.txt"
ADD test?.txt /test/

# 添加 "test" 到 `WORKDIR` /test/   
ADD test test/

# 添加 "test" 到 /test/     
ADD test /test/    

CMD指令

构建容器后调用,也就是在容器启动时才进行调用。类似于 RUN 指令,用于运行程序。

CMD 在docker run 时运行。

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

如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效

# 格式:
CMD  
CMD ["<可执行文件或命令>","","",...] 
CMD ["","",...]  

# 示例:
CMD echo "This is chengxuyuan test." 
CMD ["/usr/bin/ls","--help"]

ENTRYPOINT指令

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序

如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效

# 格式:
ENTRYPOINT ["","","",...]

构建上下文

docker build命令从Dockerfile和上下文docker buildx build构建 Docker 映像 。

构建上下文是您的构建可以访问的文件集。传递给构建命令的位置参数指定要用于构建的上下文。

命令:

docker build [OPTIONS] PATH | URL | -

可以传递以下任何输入作为构建的上下文:

  • 本地目录的相对或绝对路径
  • Git 存储库、tarball 或纯文本文件的远程 URL
  • docker build通过标准输入通过管道传输到命令的纯文本文件或 tarball

有关可在构建中使用的不同类型的文件系统上下文的更多信息,请参阅:

  • 本地文件
  • Git 存储库
  • 远程 tarball




【docker 】Dockerfile指令学习_第3张图片

你可能感兴趣的:(docker,docker,学习,容器)