目录
FROM - 指定基础镜像。这是 Dockerfile 的第一个指令,用于指定构建新镜像所依赖的基础镜像。
RUN - 执行一个命令,通常用于安装软件包或执行其他系统级操作。
CMD - 指定容器运行时的默认命令,如果在运行容器命令时没有指定,那么就会使用dockerfile中的这个命令。
ENTRYPOINT - 类似于 CMD,但更为强制。它定义了容器启动时要运行的命令,无论是否在运行容器时指定了命令。
COPY - 将本地文件系统上的文件或目录复制到容器的文件系统。
ADD - 与 COPY 类似,但支持远程 URL 和自动解压缩功能。
WORKDIR - 设置工作目录,后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令都会在这个目录下执行。
ENV - 设置环境变量,这些变量可以在构建过程中或运行容器时使用。
ARG - 设置构建参数,这些参数仅在构建镜像过程中使用,不会影响运行容器。
USER - 设置运行时的用户 ID(UID)和/或组 ID(GID),以及可能的用户名和组名。
VOLUME - 创建一个挂载点,可以在运行时将本地文件系统或其他容器的卷挂载到此挂载点。
ONBUILD - 为基础镜像添加触发器,在派生镜像的构建过程中,触发器会按照定义的顺序执行。
STOPSIGNAL - 设置停止容器时发送的信号,默认为 SIGTERM。
HEALTHCHECK - 添加一个用于检查容器健康状况的命令。
SHELL - 更改用于执行后续 RUN 指令的默认 shell。 默认情况下,Docker 使用 /bin/sh -c。
常用参数
FROM - 指定基础镜像。这是 Dockerfile 的第一个指令,用于指定构建新镜像所依赖的基础镜像。
FROM
参数在 Dockerfile 中用于指定基础镜像。基础镜像是构建新镜像的起点,通常包含一个最小化的操作系统或其他必要的软件组件。当你创建一个新的 Dockerfile 时,FROM
指令是必须的,它是 Dockerfile 中的第一个指令。
FROM <image>[:<tag> | @<digest>]
<image>
: 镜像名称,例如:ubuntu
,alpine
,python
,node
等。<tag>
(可选): 镜像的标签,用于指定特定版本。如果省略标签,Docker 会默认使用latest
标签。例如:18.04
,3.7
,12.18
等。<digest>
(可选): 镜像的摘要,用于确保所选镜像的唯一性和完整性。摘要是一个加密哈希值,通常由镜像仓库生成。摘要在实际使用中不太常见,因为大多数用户倾向于使用标签。
示例:
使用默认标签(latest)的基础镜像:
FROM ubuntu
使用特定版本的基础镜像:
FROM ubuntu:18.04
使用摘要指定基础镜像:
FROM ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
RUN - 执行一个命令,通常用于安装软件包或执行其他系统级操作。
RUN
参数在 Dockerfile 中用于执行命令。通常,这些命令用于安装软件包、设置环境变量、创建目录等。RUN
指令在构建镜像的过程中执行,并且它的结果会被包含在新的镜像层中。这意味着在构建过程中执行的每个 RUN
指令都会创建一个新的镜像层。
RUN
参数有两种使用方式:
1. shell 格式:
RUN <command>
在这种格式下,命令会在一个新的 shell 中执行(默认为 /bin/sh -c
)。例如:
RUN apt-get update && apt-get install -y curl
2. exec 格式:
RUN ["executable", "param1", "param2", ...]
在这种格式下,命令会在不使用 shell 的情况下执行。这种格式对于那些不依赖于 shell 的命令非常有用。例如:
RUN ["pip", "install", "requests"]
注意:为了减少镜像层数量和大小,建议将多个相关的命令组合成一个 RUN
指令,使用 &&
将它们连接起来。例如:
RUN apt-get update && \
apt-get install -y curl wget && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
这样做可以确保所有命令都在一个镜像层中执行,从而减少了最终镜像的大小。
关于
/bin/sh -c的说明:
/bin/sh
是 Unix 和类 Unix 系统上的一个 shell 程序,它用于解析和执行命令行。-c
是一个选项,用于指定要执行的命令字符串。因此,/bin/sh -c
表示使用/bin/sh
shell 程序来执行后面的命令字符串。当你在 Dockerfile 中使用 shell 格式的
RUN
指令时,Docker 会默认使用/bin/sh -c
来执行命令。例如:RUN echo "Hello, World!"
在构建镜像过程中,Docker 实际上会执行以下命令:
/bin/sh -c 'echo "Hello, World!"'
这里,
/bin/sh
会启动一个新的 shell 进程,并使用-c
选项将echo "Hello, World!"
作为命令字符串执行。注意:在某些基础镜像中,可能会使用不同的 shell 程序(如
/bin/bash
或/bin/ash
)。你可以在 Dockerfile 中使用SHELL
指令更改默认的 shell 程序。例如:SHELL ["/bin/bash", "-c"] RUN echo "Hello, World!"
在这个例子中,Docker 会使用
/bin/bash -c
代替/bin/sh -c
来执行后续的RUN
指令。
CMD - 指定容器运行时的默认命令,如果在运行容器命令时没有指定,那么就会使用dockerfile中的这个命令。
CMD
参数在 Dockerfile 中用于指定容器运行时的默认命令。当你启动一个容器时,如果没有提供一个明确的命令,那么 Docker 就会执行 Dockerfile 中定义的 CMD
命令。CMD
命令可以被容器启动时提供的命令覆盖。如果 Dockerfile 中同时包含 CMD
和 ENTRYPOINT
,那么 CMD
中的参数将作为 ENTRYPOINT
命令的默认参数。
CMD
参数有三种使用方式:
1. shell 格式:
CMD <command>
在这种格式下,命令会在一个新的 shell 中执行(默认为 /bin/sh -c
)。例如:
CMD echo "Hello, World!"
2. exec 格式:
CMD ["executable", "param1", "param2", ...]
在这种格式下,命令会在不使用 shell 的情况下执行。这种格式对于那些不依赖于 shell 的命令非常有用。例如:
CMD ["python", "app.py"]
3. 作为 ENTRYPOINT
的参数:
CMD ["param1", "param2", ...]
在这种格式下,CMD
中的参数将作为 ENTRYPOINT
命令的默认参数。如果在运行容器时提供了新的参数,那么这些参数将覆盖 CMD
中的参数。例如:
ENTRYPOINT ["python", "app.py"]
CMD ["--help"]
在这个例子中,如果在运行容器时没有提供任何参数,容器将执行 python app.py --help
。如果提供了新的参数,例如 --version
,那么容器将执行 python app.py --version
,忽略 CMD
中的 --help
参数。
关于CMD命令覆盖的说明:
CMD
参数在 Dockerfile 中定义了一个默认命令,这个命令会在启动容器时执行。当你在运行一个容器时,如果没有提供一个明确的命令,那么 Docker 就会使用 Dockerfile 中定义的CMD
命令作为默认命令来执行。例如,假设你有一个 Dockerfile,其中包含以下指令:
FROM ubuntu:latest CMD ["echo", "Hello, World!"]
当你用这个 Dockerfile 构建一个镜像并运行一个容器时,如果你没有提供一个明确的命令,那么容器会默认执行
CMD
中定义的命令,即echo Hello, World!
。你可以在运行容器时通过提供一个命令来覆盖 Dockerfile 中的
CMD
指令。例如,如果你运行以下命令:docker run --rm your-image-name echo "Hello, Docker!"
在这个例子中,容器会执行
echo "Hello, Docker!"
,而不是 Dockerfile 中定义的CMD
指令。
ENTRYPOINT - 类似于 CMD
,但更为强制。它定义了容器启动时要运行的命令,无论是否在运行容器时指定了命令。
ENTRYPOINT
参数在 Dockerfile 中用于指定容器启动时要运行的可执行文件或脚本。它类似于 CMD
,但更为强制,因为它定义的命令不会被容器启动时提供的命令覆盖。如果 Dockerfile 中同时包含 CMD
和 ENTRYPOINT
,那么 CMD
中的参数将作为 ENTRYPOINT
命令的默认参数。
ENTRYPOINT
参数有两种使用方式:
1. exec 格式(推荐):
ENTRYPOINT ["executable", "param1", "param2", ...]
在这种格式下,命令会在不使用 shell 的情况下执行。这种格式对于那些不依赖于 shell 的命令非常有用。例如:
ENTRYPOINT ["python", "app.py"]
2. shell 格式:
ENTRYPOINT <command>
在这种格式下,命令会在一个新的 shell 中执行(默认为 /bin/sh -c
)。例如:
ENTRYPOINT echo "Hello, World!"
ENTRYPOINT
可以与 CMD
一起使用,以提供默认参数。例如:
ENTRYPOINT ["python", "app.py"]
CMD ["--help"]
在这个例子中,如果在运行容器时没有提供任何参数,容器将执行 python app.py --help
。如果提供了新的参数,例如 --version
,那么容器将执行 python app.py --version
,并使用新提供的参数替换 CMD
中的 --help
参数。
注意:如果需要更改 ENTRYPOINT
参数,可以在运行容器时使用 --entrypoint
选项手动覆盖它。例如:
docker run --entrypoint <new-entrypoint> <image>
COPY - 将本地文件系统上的文件或目录复制到容器的文件系统。
COPY
参数在 Dockerfile 中用于从构建上下文(通常是与 Dockerfile 同一个目录或其子目录)复制文件或目录到新创建的 Docker 镜像中。这对于将应用程序的源代码、配置文件等添加到镜像中非常有用。
COPY
参数的使用方式如下:
COPY [--chown=<user>:<group>] <src>... <dest>
--chown=<user>:<group>
(可选): 设置复制到镜像中的文件或目录的所有者和组。例如:--chown=www-data:www-data
。<src>
: 源文件或目录,位于构建上下文中。可以使用通配符*
匹配多个文件。例如:*.txt
。<dest>
: 目标路径,即在新创建的镜像中的位置。
示例:
- 复制单个文件:
COPY config.ini /app/config.ini
- 复制整个目录:
COPY src /app/src
这将从构建上下文中复制整个 src
目录(包括其子目录和文件)到镜像的 /app/src
目录下。
- 使用通配符复制多个文件:
COPY *.txt /app/
这将从构建上下文中复制所有扩展名为 .txt
的文件到镜像的 /app
目录下。
- 设置复制文件的所有者和组:
COPY --chown=www-data:www-data src /app/src
这将从构建上下文中复制整个 src
目录到镜像的 /app/src
目录下,并将所有者和组设置为 www-data
。
注意:COPY
指令会在每次执行时创建一个新的镜像层。为了减少镜像层数量和大小,建议将相关的 COPY
指令组合在一起。
www-data:www-data
的格式表示:
- 第一个
www-data
是文件或目录的所有者(用户)。- 第二个
www-data
(在冒号之后)是文件或目录所属的组。如果不理解
www-data,请参考该文章:
www-data - Ubuntu Web服务所属用户/组 | Heary's Blog
ADD - 与 COPY
类似,但支持远程 URL 和自动解压缩功能。
ADD
参数在 Dockerfile 中用于将文件或目录从构建上下文(通常是与 Dockerfile 相同的目录或其子目录)复制到新创建的 Docker 镜像中。与 COPY
类似,它对于将应用程序的源代码、配置文件等添加到镜像中非常有用。但是,ADD
指令在以下两个方面具有额外的功能:
- 可以从远程 URL 下载文件并将其添加到镜像中。
- 如果源文件是一个压缩文件(如 .tar.gz),
ADD
会自动解压缩文件并将其内容添加到镜像中。
ADD
参数的使用方式如下:
ADD [--chown=<user>:<group>] <src>... <dest>
--chown=<user>:<group>
(可选): 设置复制到镜像中的文件或目录的所有者和组。例如:--chown=www-data:www-data
。<src>
: 源文件或目录,位于构建上下文中。也可以是一个远程 URL。可以使用通配符*
匹配多个文件。例如:*.txt
。<dest>
: 目标路径,即在新创建的镜像中的位置。
示例:
1. 复制本地文件:
ADD config.ini /app/config.ini
这将从构建上下文中复制 config.ini
文件到镜像的 /app
目录下。
2. 从远程 URL 下载文件:
ADD https://example.com/file.txt /app/file.txt
这将从远程 URL https://example.com/file.txt
下载文件,并将其添加到镜像的 /app
目录下。
3. 复制并自动解压缩压缩文件:
ADD archive.tar.gz /app/
这将从构建上下文中复制 archive.tar.gz
文件,并将其自动解压缩到镜像的 /app
目录下。
4. 设置复制文件的所有者和组:
ADD --chown=www-data:www-data src /app/src
这将从构建上下文中复制整个 src
目录到镜像的 /app/src
目录下,并将所有者和组设置为 www-data
。
尽管 ADD
具有额外的功能,但 Docker 官方文档建议在大多数情况下使用 COPY
,因为它的行为更简单且更易于理解。仅当需要从远程 URL 下载文件或自动解压缩文件时,才考虑使用 ADD
。
WORKDIR - 设置工作目录,后续的 RUN
、CMD
、ENTRYPOINT
、COPY
和 ADD
指令都会在这个目录下执行。
WORKDIR
参数在 Dockerfile 中用于设置后续指令(如 RUN
、CMD
、ENTRYPOINT
、COPY
和 ADD
等)的工作目录。如果在 Dockerfile 中使用了多个 WORKDIR
指令,那么后续指令的工作目录将会是最后一个 WORKDIR
设置的目录。
WORKDIR
参数的使用方式如下:
WORKDIR <directory>
<directory>
: 要将工作目录设置为的目标路径。如果目录不存在,Docker 将在执行 WORKDIR
指令时自动创建它。
示例:
1. 设置工作目录:
WORKDIR /app
这将设置 /app
为后续指令的工作目录。例如,如果后面有一个 COPY
指令,如下所示:
COPY config.ini .
这将从构建上下文中复制 config.ini
文件到镜像的 /app
目录下,而不是到镜像的根目录。
2. 使用多个 WORKDIR
指令:
WORKDIR /app
COPY . .
WORKDIR /app/src
RUN npm install
在这个例子中,COPY
指令将使用 /app
作为工作目录,而 RUN
指令则将使用 /app/src
作为工作目录。
使用 WORKDIR
指令的好处是它可以使 Dockerfile 更加清晰和可读。通过设置工作目录,可以避免在后续指令中使用冗长的绝对路径,从而提高可维护性。
EXPOSE - 声明容器运行时需要暴露的端口。
EXPOSE
参数在 Dockerfile 中用于声明容器运行时将监听的网络端口。这对于在容器中运行 Web 服务器或其他需要暴露端口的服务非常重要。需要注意的是,EXPOSE
仅仅是一种声明,实际上并不会自动将容器的端口映射到宿主机。要映射端口,需要在运行容器时使用 -p
或 --publish
参数。
EXPOSE
参数的使用方式如下:
EXPOSE <port> [<port>/<protocol>...]
<port>
: 要暴露的端口号。可以是一个单独的端口号,也可以是一个端口范围,例如8000-9000
。<port>/<protocol>
(可选): 要暴露的端口号以及协议。协议可以是tcp
或udp
。如果未指定协议,默认为tcp
。
示例:
1. 暴露单个端口:
EXPOSE 80
这将声明容器将在运行时监听 80 端口。
2. 暴露多个端口:
EXPOSE 80 443
这将声明容器将在运行时监听 80 和 443 端口。
3. 暴露端口并指定协议:
EXPOSE 80/tcp 53/udp
这将声明容器将在运行时监听 80 端口(TCP 协议)和 53 端口(UDP 协议)。
4. 暴露端口范围:
EXPOSE 8000-9000
这将声明容器将在运行时监听 8000 到 9000 之间的所有端口。
当容器运行时,需要使用 -p
或 --publish
参数将宿主机端口映射到容器端口,例如:
docker run -p 8080:80 <image>
这将宿主机的 8080 端口映射到容器的 80 端口。
其他参数
ENV - 设置环境变量,这些变量可以在构建过程中或运行容器时使用。
ENV
参数在 Dockerfile 中用于设置环境变量。这些环境变量在构建镜像过程中以及在创建的容器中都可用。环境变量对于配置应用程序、设置路径、传递参数等任务非常有用。
ENV
参数的使用方式如下:
ENV <key>=<value> ...
<key>
: 环境变量的名称。<value>
: 环境变量的值。
可以在一行中设置多个环境变量,只需用空格分隔它们即可。
示例:
1. 设置单个环境变量:
ENV APP_ENV=production
这将设置一个名为 APP_ENV
的环境变量,其值为 production
。
2. 设置多个环境变量:
ENV APP_ENV=production APP_PORT=8000
这将同时设置名为 APP_ENV
的环境变量(值为 production
)和名为 APP_PORT
的环境变量(值为 8000
)。
设置了环境变量后,可以在 Dockerfile 的其他指令中使用它们,例如:
ENV APP_DIR=/app
WORKDIR ${APP_DIR}
此外,在运行容器时,也可以访问这些环境变量。在应用程序中,可以读取这些环境变量来配置不同的参数,例如数据库连接信息、API 密钥等。这样可以避免将敏感信息硬编码到应用程序或 Dockerfile 中,从而提高安全性和可维护性。
ARG - 设置构建参数,这些参数仅在构建镜像过程中使用,不会影响运行容器。
ARG
参数在 Dockerfile 中用于定义可在构建过程中传递给构建命令的变量。这些变量在构建镜像时是可用的,但在运行时不会保留。这使得 ARG
变量非常适合用于定制镜像构建过程,如根据不同环境或需求选择不同的基础镜像、安装不同版本的软件包等。
ARG
参数的使用方式如下:
ARG <key>[=<default_value>]
<key>
: 构建参数的名称。<default_value>
(可选): 构建参数的默认值。如果在构建过程中未提供此参数的值,将使用此默认值。
在 Dockerfile 中定义了 ARG
参数后,可以在构建镜像时使用 --build-arg
选项传递参数值:
docker build --build-arg <key>=<value> .
示例:
1. 定义一个没有默认值的构建参数:
ARG APP_VERSION
这将定义一个名为 APP_VERSION
的构建参数,但不提供默认值。
2. 定义一个带有默认值的构建参数:
ARG APP_VERSION=1.0.0
这将定义一个名为 APP_VERSION
的构建参数,其默认值为 1.0.0
在 Dockerfile 中定义了 ARG
参数后,可以在其他指令中使用它们,例如:
ARG APP_VERSION
RUN wget https://example.com/app-${APP_VERSION}.tar.gz
在构建镜像时,可以使用 --build-arg
选项传递参数值:
docker build --build-arg APP_VERSION=2.0.0 .
这将覆盖 Dockerfile 中定义的 APP_VERSION
默认值(如果有的话),并在构建过程中使用提供的值。
注意:ARG
变量仅在构建过程中可用,而在运行时不可用。如果需要在运行时访问变量,应使用 ENV
指令。
USER - 设置运行时的用户 ID(UID)和/或组 ID(GID),以及可能的用户名和组名。
USER
参数在 Dockerfile 中用于指定后续指令(如 RUN
、CMD
和 ENTRYPOINT
等)以及运行容器时所使用的用户。默认情况下,Docker 容器会以 root 用户身份运行。为了提高安全性,可以使用 USER
参数切换到非 root 用户运行应用程序。
USER
参数的使用方式如下:
USER <user>[:<group>]
<user>
: 要切换到的用户。可以是用户名或用户 ID。<group>
(可选): 要切换到的组。可以是组名或组 ID。如果未指定,则使用用户的默认组。
示例:
1. 切换到指定用户:
USER www-data
这将切换到名为 www-data
的用户,后续指令和运行容器将以该用户身份执行。
2. 切换到指定用户和组:
USER www-data:www-data
这将切换到名为 www-data
的用户和组,后续指令和运行容器将以该用户和组的身份执行。
在使用 USER
参数之前,需要确保要切换到的用户和组已经存在。可以使用 RUN
指令和相应的命令创建用户和组,例如:
RUN groupadd -r mygroup && useradd -r -g mygroup myuser
USER myuser
这将创建一个名为 mygroup
的组,然后创建一个名为 myuser
的用户并将其添加到 mygroup
组。接下来,使用 USER
参数切换到 myuser
用户。
VOLUME - 创建一个挂载点,可以在运行时将本地文件系统或其他容器的卷挂载到此挂载点。
VOLUME
参数在 Dockerfile 中用于创建一个挂载点,将宿主机或其他容器的文件系统挂载到当前容器。这使得容器可以访问外部文件系统,并在需要时持久化数据。通常情况下,容器中的数据在容器被删除时也会丢失,但通过使用挂载卷,可以在多个容器之间共享数据或将数据持久化到宿主机。
VOLUME
参数的使用方式如下:
VOLUME ["/path/to/volume"]
-
"/path/to/volume"
: 要在容器中创建的挂载点的路径。这个路径是一个绝对路径。
示例:
1. 创建一个挂载卷:
VOLUME ["/data"]
这将在容器中创建一个名为 /data
的挂载点。在运行容器时,可以将宿主机的文件系统或其他容器的卷挂载到这个挂载点。
在运行容器时,需要使用 -v
或 --volume
参数将宿主机目录或其他容器的卷挂载到容器的挂载点,例如:
docker run -v /path/on/host:/data <image>
这将宿主机的 /path/on/host
目录挂载到容器的 /data
目录。
除了在 Dockerfile 中使用 VOLUME
参数外,还可以在运行容器时使用 --mount
参数来挂载卷,而不需要在 Dockerfile 中预先定义挂载点。例如:
docker run --mount type=bind,source=/path/on/host,target=/data <image>
这将宿主机的 /path/on/host
目录挂载到容器的 /data
目录,即使 Dockerfile 中没有定义 /data
为挂载点。
LABEL - 为镜像添加元数据,通常以键值对的形式。
LABEL
参数在 Dockerfile 中用于添加元数据到镜像。这些元数据可以包括有关镜像的信息,如作者、版本、描述等。元数据可以帮助用户和工具更好地理解镜像的用途和来源,从而提高可维护性和可读性。
LABEL
参数的使用方式如下:
LABEL <key>=<value> ...
<key>
: 元数据标签的名称。<value>
: 元数据标签的值。
可以在一行中设置多个元数据标签,只需用空格分隔它们即可。
示例:
1. 添加单个元数据标签:
LABEL maintainer="John Doe <john.doe@example.com>"
这将添加一个名为 maintainer
的元数据标签,其值为 John Doe <john.doe@example.com>
。
2. 添加多个元数据标签:
这将同时添加名为 version
的元数据标签(值为 1.0.0
)和名为 description
的元数据标签(值为 An example application
)。
可以使用 docker inspect
命令查看镜像的元数据标签:
docker inspect <image>
这将返回一个 JSON 对象,其中包含镜像的详细信息,包括 Labels
字段,该字段显示了所有定义的元数据标签。
ONBUILD - 为基础镜像添加触发器,在派生镜像的构建过程中,触发器会按照定义的顺序执行。
ONBUILD
参数在 Dockerfile 中用于定义在其他镜像中使用当前镜像作为基础镜像时要执行的指令。这些指令不会在当前镜像的构建过程中立即执行,而是在使用当前镜像作为基础镜像构建其他镜像时触发。这使得镜像作者可以在镜像中包含一些通用的操作,而不必在每个使用该镜像的 Dockerfile 中重复这些操作。
ONBUILD
参数的使用方式如下:
ONBUILD <instruction>
-
<instruction>
: 一个有效的 Dockerfile 指令,例如COPY
、RUN
、ADD
等。
示例:
1. 在基础镜像中定义一个 ONBUILD
指令:
ONBUILD COPY . /app
这将在当前镜像中定义一个 ONBUILD
指令,该指令在使用当前镜像作为基础镜像构建其他镜像时将文件从构建上下文复制到 /app
目录。
2. 在其他镜像中使用具有 ONBUILD
指令的基础镜像:
FROM example_base
假如包含ONBUILD
指令的镜像就叫example_base, 那么当别人基于你这个镜像构建的时候将自动执行在基础镜像中定义的 ONBUILD
指令。
注意:ONBUILD
指令只能用于构建其他镜像时触发的操作。它们不适用于在运行容器时需要执行的操作,如设置环境变量、暴露端口等。对于这些操作,请使用相应的 Dockerfile 指令,如 ENV
、EXPOSE
等。
STOPSIGNAL - 设置停止容器时发送的信号,默认为 SIGTERM。
STOPSIGNAL
参数在 Dockerfile 中用于指定在停止容器时要发送给容器主进程的信号。默认情况下,当停止容器时,Docker 会发送 SIGTERM
信号,然后等待一段时间(默认为 10 秒),如果容器仍未停止,Docker 将发送 SIGKILL
信号强制停止容器。通过设置 STOPSIGNAL
参数,可以自定义发送的信号,以便更好地控制容器的停止过程。
STOPSIGNAL
参数的使用方式如下:
STOPSIGNAL <signal>
<signal>
: 要发送的信号。可以是信号名称(如 SIGINT
)或信号数字(如 2
,对应于 SIGINT
)。
示例:
设置自定义停止信号:
STOPSIGNAL SIGINT
这将指定在停止容器时发送 SIGINT
信号给容器主进程,而不是默认的 SIGTERM
信号。
注意:设置 STOPSIGNAL
参数仅影响停止容器时发送的信号。容器的主进程应该能够正确处理这个信号,才能实现预期的停止行为。在编写应用程序时,可以添加信号处理程序来捕获和处理这些信号,以便在收到停止信号时执行清理操作或平滑地终止程序
HEALTHCHECK - 添加一个用于检查容器健康状况的命令。
HEALTHCHECK
参数在 Dockerfile 中用于定义如何检查容器中的应用程序是否正常运行。通过定期执行一个命令或脚本,可以检测应用程序的健康状况并报告给 Docker。这有助于监控应用程序的状态,并在出现问题时自动采取相应的操作(如重启容器或重新调度服务)。
HEALTHCHECK
参数的使用方式如下:
HEALTHCHECK [OPTIONS] CMD command
[OPTIONS]
(可选): 一些用于配置健康检查行为的选项,如检查间隔、超时、重试次数等。CMD command
: 要执行的命令或脚本,用于检测应用程序的健康状况。这个命令应该能够返回一个状态码,其中0
表示健康,1
表示不健康。
可用的选项包括:
--interval=DURATION
: 每次健康检查之间的时间间隔,默认为 30 秒。--timeout=DURATION
: 健康检查命令的超时时间,默认为 30 秒。--start-period=DURATION
: 容器启动后,在开始执行健康检查之前的时间,默认为 0 秒。--retries=N
: 连续失败的健康检查次数,达到此次数后,容器将被标记为不健康,默认为 3 次。
示例:
1. 定义一个简单的健康检查:
HEALTHCHECK CMD curl --fail http://localhost:8080/health || exit 1
这将使用 curl
命令检查应用程序的 /health
端点。如果请求成功(返回状态码为 200
),则认为应用程序是健康的。否则,返回状态码为 1
,表示应用程序不健康。
2. 定义一个带有选项的健康检查:
HEALTHCHECK --interval=1m --timeout=10s --retries=3 \
CMD curl --fail http://localhost:8080/health || exit 1
这将配置健康检查的选项,例如每分钟检查一次、超时时间为 10 秒,以及允许连续失败 3 次。
注意:HEALTHCHECK
指令并不会自动修复容器中的问题。它只是提供了一个机制来报告应用程序的健康状况。根据这些信息,可以使用编排工具(如 Docker Swarm 或 Kubernetes)配置相应的操作,如重启不健康的容器或重新调度服务。
SHELL - 更改用于执行后续 RUN
指令的默认 shell。 默认情况下,Docker 使用 /bin/sh -c
。
SHELL
参数在 Dockerfile 中用于设置运行其他命令(如 RUN
、CMD
和 ENTRYPOINT
)时使用的默认 shell。默认情况下,Docker 使用 /bin/sh -c
作为 shell(对于 Windows 容器,默认为 cmd /S /C
)。但是,有时可能需要使用不同的 shell,例如 /bin/bash
、powershell
或其他自定义 shell。SHELL
参数允许你修改默认 shell。
SHELL
参数的使用方式如下:
SHELL ["executable", "parameters"]
executable
: 要使用的 shell 可执行文件。通常是一个绝对路径,如/bin/bash
。parameters
: 传递给 shell 的参数。通常是-c
,表示接下来的命令行参数是要执行的命令。
示例:
1. 设置 /bin/bash
为默认 shell:
SHELL ["/bin/bash", "-c"]
这将设置 /bin/bash
为默认 shell,用于运行 RUN
、CMD
和 ENTRYPOINT
指令中的命令。之后在 Dockerfile 中编写的命令将使用 /bin/bash
而不是 /bin/sh
执行。
注意:当更改默认 shell 时,可能需要调整 Dockerfile 中的命令语法,以适应新 shell 的语法。例如,当切换到 /bin/bash
时,可能需要使用 bash 的语法和功能,如命令替换、进程替换等。同时,更改默认 shell 可能会影响之前的 RUN
、CMD
和 ENTRYPOINT
指令,因此需要确保它们在新 shell 下仍然能够正常工作。
参考文章:
👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!