Appearance
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/workdir1.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 /tmp1.9 CMD
CMD 指令用于为执行容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您必须指定ENTRYPOINT指令。如果指定了ENTRYPOINT,则CMD提供默认参数。
Dockerfile
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param21.10 ENTRYPOINT
ENTRYPOINT 指令设置容器启动时要运行的命令及其参数。这些参数始终会被传递给镜像中指定的命令,即使您在docker run命令行上指定了其他参数,这些参数也可以被覆盖。
Dockerfile
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param22 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 .