Skip to content

Dockerfile ​

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

要在构建上下文中使用文件,Dockerfile指的是在指令中指定的文件,例如COPY指令。要提高构建的性能,请通过将.dockerignore文件添加到上下文目录来排除文件和目录。

1 Dockerfile指令 ​

我们编写Dockerfile时,最重要的是理解其中的指令含义,由于常用指令不多,我们可以分别做说明

指令不区分大小写。但是,约定是大写的,以便更容易地将它们与参数区分开来。

1.1 FROM ​

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

该FROM指令初始化一个新的构建阶段并为后续指令设置 基本映像。因此,有效Dockerfile必须以FROM指令开始。

多段构建时,请设置各个阶段的名称[AS <name>]以方便后续构建阶段引用。

1.2 RUN ​

RUN 在容器中执行命令,有两种形式:

  • RUN <command>shell形式,命令在 shell 中运行
  • RUN ["executable", "param1", "param2"](执行形式)

该RUN指令将在当前镜像之上的新层中执行任意命令并提交结果。生成的提交镜像将用于Dockerfile的下一步操作.

1.3 COPY ​

COPY 将文件和目录复制到镜像中。有两种形式,对于包含空格的路径,后一种形式是必需的:

  • COPY [--from==<image|stage|context>] <src>... <dst>
  • COPY [--from==<image|stage|context>] ["<src>",... "<dst>"]

要从多阶段构建的构建阶段复制,请指定要从中复制的阶段的名称

Dockerfile
# syntax=docker/dockerfile:1
FROM alpine AS build
COPY . .
RUN apk add clang
RUN clang -o /hello hello.c

FROM scratch
COPY --from=build /hello /

1.4 WORKDIR ​

设置工作目录,设置后 后续命令等都在此目录执行

Dockerfile
WORKDIR /path/to/workdir

1.5 EXPOSE ​

EXPOSE 指令通知 Docker 容器在运行时监听指定的网络端口。可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP。

Dockerfile
EXPOSE <port> [<port>/<protocol>...]

1.6 ENV ​

ENV 设置环境变量,可以在后续指令中使用,如RUN等

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

1.7 ARG ​

ARG 指令定义了一个在构建时传递给构建器的变量。可以在docker build命令行上使用--build-arg <varname>=<value>来传递值。

Dockerfile
ARG <name>[=<default>]

1.8 VOLUME ​

VOLUME 指令创建一个挂载点并将其实际路径挂载到容器中。该VOLUME指令支持以下语法:

Dockerfile
VOLUME ["/data"]
VOLUME /data
VOLUME /data /tmp

1.9 CMD ​

CMD 指令用于为执行容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您必须指定ENTRYPOINT指令。如果指定了ENTRYPOINT,则CMD提供默认参数。

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

1.10 ENTRYPOINT ​

ENTRYPOINT 指令设置容器启动时要运行的命令及其参数。这些参数始终会被传递给镜像中指定的命令,即使您在docker run命令行上指定了其他参数,这些参数也可以被覆盖。

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

2 CMD和ENTRYPOINT的差异 ​

CMD和ENTRYPOINT都是用来指定容器启动时要运行的命令的,但它们之间有一些重要的区别。

2.1 CMD ​

CMD指定的命令在容器启动时会被执行,但它可以被在docker run命令中指定的命令覆盖

CMD可以是一个命令字符串,也可以是一个命令数组。如果是字符串,会被解释为Shell命令。如果是数组,不会被解释为Shell命令

场景:

  • 定义容器的默认行为,当用户未指定特定命令时。
  • 在Dockerfile中设置默认参数,以适应多种使用情况。

2.2 ENTRYPOINT ​

ENTRYPOINT指定的命令始终会被执行,即使在运行容器时指定了其他命令。 ENTRYPOINT只能是一个命令数组,它不会被解释为Shell命令。

场景:

  • 定义容器的主要入口点,始终执行该命令。
  • 创建可重用的Docker映像,以便用户可以在ENTRYPOINT命令上提供自定义参数。

5. 构建镜像 ​

构建镜像的命令格式为:

bash
docker build  -t app-name:latest .

如果dockerfile文件在当前目录下,则不需要指定文件路径,如果不在当前目录下,则需要指定文件路径

bash
docker build -f ./docker/Dockerfile  -t app-name:latest .