【Docker】Dockerfile参数速查

目录

常用参数  

FROM - 指定基础镜像。这是 Dockerfile 的第一个指令,用于指定构建新镜像所依赖的基础镜像。

RUN - 执行一个命令,通常用于安装软件包或执行其他系统级操作。

CMD - 指定容器运行时的默认命令,如果在运行容器命令时没有指定,那么就会使用dockerfile中的这个命令。

ENTRYPOINT - 类似于 CMD,但更为强制。它定义了容器启动时要运行的命令,无论是否在运行容器时指定了命令。

COPY - 将本地文件系统上的文件或目录复制到容器的文件系统。

ADD - 与 COPY 类似,但支持远程 URL 和自动解压缩功能。

WORKDIR - 设置工作目录,后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令都会在这个目录下执行。

EXPOSE - 声明容器运行时需要暴露的端口。

其他参数  

ENV - 设置环境变量,这些变量可以在构建过程中或运行容器时使用。

ARG - 设置构建参数,这些参数仅在构建镜像过程中使用,不会影响运行容器。

USER - 设置运行时的用户 ID(UID)和/或组 ID(GID),以及可能的用户名和组名。

VOLUME - 创建一个挂载点,可以在运行时将本地文件系统或其他容器的卷挂载到此挂载点。

LABEL - 为镜像添加元数据,通常以键值对的形式。

ONBUILD - 为基础镜像添加触发器,在派生镜像的构建过程中,触发器会按照定义的顺序执行。

STOPSIGNAL - 设置停止容器时发送的信号,默认为 SIGTERM。

HEALTHCHECK - 添加一个用于检查容器健康状况的命令。

SHELL - 更改用于执行后续 RUN 指令的默认 shell。 默认情况下,Docker 使用 /bin/sh -c。


常用参数  

FROM - 指定基础镜像。这是 Dockerfile 的第一个指令,用于指定构建新镜像所依赖的基础镜像。

Dockerfile reference

FROM 参数在 Dockerfile 中用于指定基础镜像。基础镜像是构建新镜像的起点,通常包含一个最小化的操作系统或其他必要的软件组件。当你创建一个新的 Dockerfile 时,FROM 指令是必须的,它是 Dockerfile 中的第一个指令。

FROM [: | @]
  • : 镜像名称,例如:ubuntu, alpine, python, node 等。
  • (可选): 镜像的标签,用于指定特定版本。如果省略标签,Docker 会默认使用 latest 标签。例如:18.04, 3.7, 12.18 等。
  • (可选): 镜像的摘要,用于确保所选镜像的唯一性和完整性。摘要是一个加密哈希值,通常由镜像仓库生成。摘要在实际使用中不太常见,因为大多数用户倾向于使用标签。

 示例:

使用默认标签(latest)的基础镜像: 

FROM ubuntu

使用特定版本的基础镜像: 

FROM ubuntu:18.04

使用摘要指定基础镜像: 

FROM ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

RUN - 执行一个命令,通常用于安装软件包或执行其他系统级操作。

Dockerfile reference

RUN 参数在 Dockerfile 中用于执行命令。通常,这些命令用于安装软件包、设置环境变量、创建目录等。RUN 指令在构建镜像的过程中执行,并且它的结果会被包含在新的镜像层中。这意味着在构建过程中执行的每个 RUN 指令都会创建一个新的镜像层。 

 RUN 参数有两种使用方式:

 1. shell 格式:

RUN 

在这种格式下,命令会在一个新的 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中的这个命令。

Dockerfile reference

CMD 参数在 Dockerfile 中用于指定容器运行时的默认命令。当你启动一个容器时,如果没有提供一个明确的命令,那么 Docker 就会执行 Dockerfile 中定义的 CMD 命令。CMD 命令可以被容器启动时提供的命令覆盖。如果 Dockerfile 中同时包含 CMDENTRYPOINT,那么 CMD 中的参数将作为 ENTRYPOINT 命令的默认参数。

CMD 参数有三种使用方式: 

1. shell 格式: 

CMD 

 在这种格式下,命令会在一个新的 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,但更为强制。它定义了容器启动时要运行的命令,无论是否在运行容器时指定了命令。

Dockerfile reference

ENTRYPOINT 参数在 Dockerfile 中用于指定容器启动时要运行的可执行文件或脚本。它类似于 CMD,但更为强制,因为它定义的命令不会被容器启动时提供的命令覆盖。如果 Dockerfile 中同时包含 CMDENTRYPOINT,那么 CMD 中的参数将作为 ENTRYPOINT 命令的默认参数。 

ENTRYPOINT 参数有两种使用方式: 

1. exec 格式(推荐): 

ENTRYPOINT ["executable", "param1", "param2", ...]

 在这种格式下,命令会在不使用 shell 的情况下执行。这种格式对于那些不依赖于 shell 的命令非常有用。例如:

ENTRYPOINT ["python", "app.py"]

2. shell 格式: 

ENTRYPOINT 

 在这种格式下,命令会在一个新的 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  

COPY - 将本地文件系统上的文件或目录复制到容器的文件系统。

Dockerfile reference

COPY 参数在 Dockerfile 中用于从构建上下文(通常是与 Dockerfile 同一个目录或其子目录)复制文件或目录到新创建的 Docker 镜像中。这对于将应用程序的源代码、配置文件等添加到镜像中非常有用。 

COPY 参数的使用方式如下: 

COPY [--chown=:] ... 
  • --chown=: (可选): 设置复制到镜像中的文件或目录的所有者和组。例如:--chown=www-data:www-data
  • : 源文件或目录,位于构建上下文中。可以使用通配符 * 匹配多个文件。例如:*.txt
  • : 目标路径,即在新创建的镜像中的位置。

示例:

  •  复制单个文件:
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 和自动解压缩功能。

Dockerfile reference

ADD 参数在 Dockerfile 中用于将文件或目录从构建上下文(通常是与 Dockerfile 相同的目录或其子目录)复制到新创建的 Docker 镜像中。与 COPY 类似,它对于将应用程序的源代码、配置文件等添加到镜像中非常有用。但是,ADD 指令在以下两个方面具有额外的功能:

  1. 可以从远程 URL 下载文件并将其添加到镜像中。
  2. 如果源文件是一个压缩文件(如 .tar.gz),ADD 会自动解压缩文件并将其内容添加到镜像中。

ADD 参数的使用方式如下: 

ADD [--chown=:] ... 
  • --chown=: (可选): 设置复制到镜像中的文件或目录的所有者和组。例如:--chown=www-data:www-data
  • : 源文件或目录,位于构建上下文中。也可以是一个远程 URL。可以使用通配符 * 匹配多个文件。例如:*.txt
  • : 目标路径,即在新创建的镜像中的位置。

 示例:

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 - 设置工作目录,后续的 RUNCMDENTRYPOINTCOPY 和 ADD 指令都会在这个目录下执行。

Dockerfile reference

WORKDIR 参数在 Dockerfile 中用于设置后续指令(如 RUNCMDENTRYPOINTCOPYADD 等)的工作目录。如果在 Dockerfile 中使用了多个 WORKDIR 指令,那么后续指令的工作目录将会是最后一个 WORKDIR 设置的目录。 

WORKDIR 参数的使用方式如下: 

WORKDIR 

 : 要将工作目录设置为的目标路径。如果目录不存在,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 - 声明容器运行时需要暴露的端口。

Dockerfile reference

EXPOSE 参数在 Dockerfile 中用于声明容器运行时将监听的网络端口。这对于在容器中运行 Web 服务器或其他需要暴露端口的服务非常重要。需要注意的是,EXPOSE 仅仅是一种声明,实际上并不会自动将容器的端口映射到宿主机。要映射端口,需要在运行容器时使用 -p--publish 参数。 

EXPOSE 参数的使用方式如下: 

EXPOSE  [/...]
  • : 要暴露的端口号。可以是一个单独的端口号,也可以是一个端口范围,例如 8000-9000
  • / (可选): 要暴露的端口号以及协议。协议可以是 tcpudp。如果未指定协议,默认为 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 

这将宿主机的 8080 端口映射到容器的 80 端口。 


其他参数  

ENV - 设置环境变量,这些变量可以在构建过程中或运行容器时使用。

Dockerfile reference

ENV 参数在 Dockerfile 中用于设置环境变量。这些环境变量在构建镜像过程中以及在创建的容器中都可用。环境变量对于配置应用程序、设置路径、传递参数等任务非常有用。 

ENV 参数的使用方式如下: 

ENV = ...
  • : 环境变量的名称。
  • : 环境变量的值。

可以在一行中设置多个环境变量,只需用空格分隔它们即可。 

示例: 

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 - 设置构建参数,这些参数仅在构建镜像过程中使用,不会影响运行容器。

Dockerfile reference

ARG 参数在 Dockerfile 中用于定义可在构建过程中传递给构建命令的变量。这些变量在构建镜像时是可用的,但在运行时不会保留。这使得 ARG 变量非常适合用于定制镜像构建过程,如根据不同环境或需求选择不同的基础镜像、安装不同版本的软件包等。 

ARG 参数的使用方式如下: 

ARG [=]
  • : 构建参数的名称。
  • (可选): 构建参数的默认值。如果在构建过程中未提供此参数的值,将使用此默认值。

在 Dockerfile 中定义了 ARG 参数后,可以在构建镜像时使用 --build-arg 选项传递参数值: 

docker build --build-arg = .

 示例:

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),以及可能的用户名和组名。

Dockerfile reference

USER 参数在 Dockerfile 中用于指定后续指令(如 RUNCMDENTRYPOINT 等)以及运行容器时所使用的用户。默认情况下,Docker 容器会以 root 用户身份运行。为了提高安全性,可以使用 USER 参数切换到非 root 用户运行应用程序。 

USER 参数的使用方式如下: 

USER [:]
  • : 要切换到的用户。可以是用户名或用户 ID。
  • (可选): 要切换到的组。可以是组名或组 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 - 创建一个挂载点,可以在运行时将本地文件系统或其他容器的卷挂载到此挂载点。

Dockerfile reference

 VOLUME 参数在 Dockerfile 中用于创建一个挂载点,将宿主机或其他容器的文件系统挂载到当前容器。这使得容器可以访问外部文件系统,并在需要时持久化数据。通常情况下,容器中的数据在容器被删除时也会丢失,但通过使用挂载卷,可以在多个容器之间共享数据或将数据持久化到宿主机。

VOLUME 参数的使用方式如下: 

VOLUME ["/path/to/volume"]
  •  "/path/to/volume": 要在容器中创建的挂载点的路径。这个路径是一个绝对路径。

 示例:

1. 创建一个挂载卷:

VOLUME ["/data"]

 这将在容器中创建一个名为 /data 的挂载点。在运行容器时,可以将宿主机的文件系统或其他容器的卷挂载到这个挂载点。

在运行容器时,需要使用 -v--volume 参数将宿主机目录或其他容器的卷挂载到容器的挂载点,例如:

docker run -v /path/on/host:/data 

 这将宿主机的 /path/on/host 目录挂载到容器的 /data 目录。

除了在 Dockerfile 中使用 VOLUME 参数外,还可以在运行容器时使用 --mount 参数来挂载卷,而不需要在 Dockerfile 中预先定义挂载点。例如: 

docker run --mount type=bind,source=/path/on/host,target=/data 

 这将宿主机的 /path/on/host 目录挂载到容器的 /data 目录,即使 Dockerfile 中没有定义 /data 为挂载点。


LABEL - 为镜像添加元数据,通常以键值对的形式。

Dockerfile reference

LABEL 参数在 Dockerfile 中用于添加元数据到镜像。这些元数据可以包括有关镜像的信息,如作者、版本、描述等。元数据可以帮助用户和工具更好地理解镜像的用途和来源,从而提高可维护性和可读性。 

LABEL 参数的使用方式如下: 

LABEL = ...
  • : 元数据标签的名称。
  • : 元数据标签的值。

可以在一行中设置多个元数据标签,只需用空格分隔它们即可。 

示例: 

1. 添加单个元数据标签: 

LABEL maintainer="John Doe "

 这将添加一个名为 maintainer 的元数据标签,其值为 John Doe

2. 添加多个元数据标签: 

这将同时添加名为 version 的元数据标签(值为 1.0.0)和名为 description 的元数据标签(值为 An example application)。 

可以使用 docker inspect 命令查看镜像的元数据标签: 

docker inspect 

 这将返回一个 JSON 对象,其中包含镜像的详细信息,包括 Labels 字段,该字段显示了所有定义的元数据标签。


ONBUILD - 为基础镜像添加触发器,在派生镜像的构建过程中,触发器会按照定义的顺序执行。

Dockerfile reference

ONBUILD 参数在 Dockerfile 中用于定义在其他镜像中使用当前镜像作为基础镜像时要执行的指令。这些指令不会在当前镜像的构建过程中立即执行,而是在使用当前镜像作为基础镜像构建其他镜像时触发。这使得镜像作者可以在镜像中包含一些通用的操作,而不必在每个使用该镜像的 Dockerfile 中重复这些操作。 

 ONBUILD 参数的使用方式如下:

ONBUILD 
  •  : 一个有效的 Dockerfile 指令,例如 COPYRUNADD 等。

示例: 

1. 在基础镜像中定义一个 ONBUILD 指令: 

ONBUILD COPY . /app

 这将在当前镜像中定义一个 ONBUILD 指令,该指令在使用当前镜像作为基础镜像构建其他镜像时将文件从构建上下文复制到 /app 目录。

2. 在其他镜像中使用具有 ONBUILD 指令的基础镜像: 

FROM example_base

假如包含ONBUILD 指令的镜像就叫example_base, 那么当别人基于你这个镜像构建的时候将自动执行在基础镜像中定义的 ONBUILD 指令。 

注意:ONBUILD 指令只能用于构建其他镜像时触发的操作。它们不适用于在运行容器时需要执行的操作,如设置环境变量、暴露端口等。对于这些操作,请使用相应的 Dockerfile 指令,如 ENVEXPOSE 等。


STOPSIGNAL - 设置停止容器时发送的信号,默认为 SIGTERM。

Dockerfile reference

STOPSIGNAL 参数在 Dockerfile 中用于指定在停止容器时要发送给容器主进程的信号。默认情况下,当停止容器时,Docker 会发送 SIGTERM 信号,然后等待一段时间(默认为 10 秒),如果容器仍未停止,Docker 将发送 SIGKILL 信号强制停止容器。通过设置 STOPSIGNAL 参数,可以自定义发送的信号,以便更好地控制容器的停止过程。

STOPSIGNAL 参数的使用方式如下: 

STOPSIGNAL 

 : 要发送的信号。可以是信号名称(如 SIGINT)或信号数字(如 2,对应于 SIGINT)。

示例: 

设置自定义停止信号: 

STOPSIGNAL SIGINT

 这将指定在停止容器时发送 SIGINT 信号给容器主进程,而不是默认的 SIGTERM 信号。

注意:设置 STOPSIGNAL 参数仅影响停止容器时发送的信号。容器的主进程应该能够正确处理这个信号,才能实现预期的停止行为。在编写应用程序时,可以添加信号处理程序来捕获和处理这些信号,以便在收到停止信号时执行清理操作或平滑地终止程序 


HEALTHCHECK - 添加一个用于检查容器健康状况的命令。

Dockerfile reference

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

Dockerfile reference

SHELL 参数在 Dockerfile 中用于设置运行其他命令(如 RUNCMDENTRYPOINT)时使用的默认 shell。默认情况下,Docker 使用 /bin/sh -c 作为 shell(对于 Windows 容器,默认为 cmd /S /C)。但是,有时可能需要使用不同的 shell,例如 /bin/bashpowershell 或其他自定义 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,用于运行 RUNCMDENTRYPOINT 指令中的命令。之后在 Dockerfile 中编写的命令将使用 /bin/bash 而不是 /bin/sh 执行。

注意:当更改默认 shell 时,可能需要调整 Dockerfile 中的命令语法,以适应新 shell 的语法。例如,当切换到 /bin/bash 时,可能需要使用 bash 的语法和功能,如命令替换、进程替换等。同时,更改默认 shell 可能会影响之前的 RUNCMDENTRYPOINT 指令,因此需要确保它们在新 shell 下仍然能够正常工作。


参考文章:

  •  Dockerfile reference
  • 编写高效的Dockerfile_容器镜像服务 SWR_最佳实践_华为云
  • mafeifan 的编程技术分享

点赞,你的认可是我创作的动力 !
收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!  

你可能感兴趣的:(docker,linux,运维)