学习文档地址
上篇文章:【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,用于RUN、CMD和ENTRYPOINT指令。 |
注释
指令不区分大小写。然而,惯例是他们要大写,以便更容易地将他们与论点区分开来。
Docker按顺序运行Dockerfile中的指令。Dockerfile必须以FROM指令开头。这可能在解析器指令、注释和全局范围的ARG之后。FROM指令指定要从中构建的父映像。FROM前面只能有一个或多个ARG指令,这些指令声明Dockerfile中FROM行中使用的参数。
Docker 将以开头的行视为#注释,除非该行是有效的 解析器指令。行中其他任何位置的标记#都被视为参数。
为了向后兼容,注释 ( #
) 和指令(例如RUN
)之前的前导空格将被忽略,但不鼓励这样做。在这些情况下,不会保留前导空格,因此以下示例是等效的:
示例1:
# 第一个Dockerfile
FROM nginx
RUN echo "<h1>程序员食堂 的第一个Dockerfile </h1>" >> /usr/share/nginx/html/index.html
指令参数中的空格(例如下面的命令RUN
)将被保留
示例2:
# 第一个Dockerfile
FROM nginx
RUN echo "<h1>程序员食堂 的第一个Dockerfile </h1>" >> /usr/share/nginx/html/index.html
ENV 环境变量
环境变量官网地址
环境变量(用ENV声明)也可以在某些指令中用作由 Dockerfile. 还可以处理转义以将类似变量的语法按字面意思包含到语句中。
ENV指令将环境变量设置<key>为值 <value>。该值将存在于构建阶段中所有后续指令的环境中,并且 也可以在许多指令中内联替换。该值将被解释为其他环境变量,因此如果不转义引号字符将被删除。与命令行解析一样,引号和反斜杠可用于在值中包含空格。
示例1:
ENV MY_NAME="zhang san feng"
ENV MY_HOME=wu\ dang\ shan
ENV MY_WORK=KungFuTeacher
ENV
指令允许<key>=<value> ...
一次设置多个变量,下面的示例将在最终图像中产生相同的最终结果:
示例2:
ENV MY_NAME="zhang san feng" MY_HOME=wu\ dang\ shan MY_WORK="kung fu teacher"
FROM指令
定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。并且必须是第一条指令。
如果不以任何镜像为基础,那么写法为:FROM scratch。
语法
FROM [image]
FROM [image]:[tag]
FROM [image]:[digest]
<tag>
和<digest>
是可选项,如果没有选择,那么默认值为latest。
RUN指令
功能为运行指定的命令
RUN命令有两种格式,shell 格式和exec 格式。
shell 格式:
# [命令行命令] 等同于,在终端操作的 shell 命令。
# RUN [命令行命令]
RUN echo "<h1>程序员食堂 的第一个Dockerfile </h1>" >> /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 <name>
MAINTAINER chengxuyuanshitang
COPY指令
COPY指令,从上下文目录中复制文件或者目录到容器里指定路径,可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。不会自动解压文件,也不能访问网络资源。
# 语法:
OPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
#示例:
#添加 "test" 到 `WORKDIR` /test/
COPY test* /test/
# 添加 "test" 到 /test/
COPY test?.txt /test/
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
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 <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...]
# 示例:
CMD echo "This is chengxuyuan test."
CMD ["/usr/bin/ls","--help"]
ENTRYPOINT指令
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
# 格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
构建上下文
docker build命令从Dockerfile和上下文docker buildx build构建 Docker 映像 。
构建上下文是您的构建可以访问的文件集。传递给构建命令的位置参数指定要用于构建的上下文。
命令:
docker build [OPTIONS] PATH | URL | -
可以传递以下任何输入作为构建的上下文:
- 本地目录的相对或绝对路径
- Git 存储库、tarball 或纯文本文件的远程 URL
- docker build通过标准输入通过管道传输到命令的纯文本文件或 tarball
有关可在构建中使用的不同类型的文件系统上下文的更多信息,请参阅:
- 本地文件
- Git 存储库
- 远程 tarball