目录

常用参数

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 <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 - 执行一个命令,通常用于安装软件包或执行其他系统级操作。

Dockerfile reference

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中的这个命令。

Dockerfile reference

CMD 参数在 Dockerfile 中用于指定容器运行时的默认命令。当你启动一个容器时,如果没有提供一个明确的命令,那么 Docker 就会执行 Dockerfile 中定义的 CMD 命令。CMD 命令可以被容器启动时提供的命令覆盖。如果 Dockerfile 中同时包含 CMDENTRYPOINT,那么 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,但更为强制。它定义了容器启动时要运行的命令,无论是否在运行容器时指定了命令。

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 <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 - 将本地文件系统上的文件或目录复制到容器的文件系统。

Dockerfile reference

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 和自动解压缩功能。

Dockerfile reference

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

  1. 可以从远程 URL 下载文件并将其添加到镜像中。
  2. 如果源文件是一个压缩文件(如 .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 - 设置工作目录,后续的 RUNCMDENTRYPOINTCOPY 和 ADD 指令都会在这个目录下执行。

Dockerfile reference

WORKDIR 参数在 Dockerfile 中用于设置后续指令(如 RUNCMDENTRYPOINTCOPYADD 等)的工作目录。如果在 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 - 声明容器运行时需要暴露的端口。

Dockerfile reference

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

EXPOSE 参数的使用方式如下:

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

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


其他参数

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

Dockerfile reference

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

Dockerfile reference

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

Dockerfile reference

USER 参数在 Dockerfile 中用于指定后续指令(如 RUNCMDENTRYPOINT 等)以及运行容器时所使用的用户。默认情况下,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 - 创建一个挂载点,可以在运行时将本地文件系统或其他容器的卷挂载到此挂载点。

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 <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 - 为镜像添加元数据,通常以键值对的形式。

Dockerfile reference

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 - 为基础镜像添加触发器,在派生镜像的构建过程中,触发器会按照定义的顺序执行。

Dockerfile reference

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

ONBUILD 参数的使用方式如下:

ONBUILD <instruction>
  • <instruction>: 一个有效的 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 <signal>

<signal>: 要发送的信号。可以是信号名称(如 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】Dockerfile参数速查相关推荐

  1. Postfix 配置参数速查

    本附录按照字母顺序,列出可在main.cf配置文件里设定的参数,并简略说明各参数的意义或用途.本附录只能算是postfix参数的"速查参考". 所有参数都有一个默认值(虽然某些默认 ...

  2. docker dockerFile 参数解释,及生成jdk+tomcat镜像实例

    Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命 ...

  3. 输入参数的数目不足_sklearn.decomposition.PCA 参数速查手册

    sklearn常用的API参数解析:sklearn.linear_model.LinearRegression 调用 sklearn.decomposition.PCA(n_components=No ...

  4. MySQL5.7 常见调优参数速查

    连接相关参数 max_connections:允许客户端并发连接的最大数量,默认值是151,一般将该参数设置为500-2000 max_connect_errors:如果客户端尝试连接的错误数量超过这 ...

  5. 机器学习算法输入输出概览与调节参数速查

    无监督学习算法 监督学习算法 调节参数

  6. 我的作品 电子元件替换速查字典V5.0

    软件下载地址:http://www.fqrcw.com 电子元件替换速查系统是为电子工程设计师.设备维修师.元件经销商.生产企业等提供晶体管参数速查帮助,快速获得晶体管元件数据资料,以辅助进行设计修正 ...

  7. Docker命令速查

    Docker命令速查 启停Docker服务 systemctl start docker 启动Docker systemctl enable docker 开机启动Docker systemctl s ...

  8. linux常用命令速查手册PDF下载

    Linux常用命令速查手册 需要该PDF文档的朋友扫码关注下方二维码[入门小站],后台回复 「1001」 自取 点击下面标题即可获取对应资料 LeetCode刷题开源手册 LeetCode题解[jav ...

  9. linux常用命令速查手册

    Linux常用命令速查手册 需要该PDF文档的朋友扫码关注下方二维码[入门小站],后台回复 「1001」 自取 点击下面标题即可获取对应资料 LeetCode刷题开源手册 LeetCode题解[jav ...

最新文章

  1. Linux网络常用工具分类介绍
  2. JDBC(Java Data Base Connectivity,java数据库连接)
  3. 【Xamarin 挖墙脚系列:Xamarin SDK开源了................】
  4. 马哥linux 培训第一周作业
  5. [C++STL]常用算术生成算法
  6. python中代理模式分为几种_通俗 Python 设计模式——代理模式
  7. 网易有道上市首日股价跌26% 市值达14亿美元
  8. Python+pandas读取Excel文件并统计演员参演电影数量
  9. (转)服务器控件三个ID
  10. Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式
  11. Glide修改本地图片缓存路径
  12. 坦克大战的Lua实现
  13. 算法左神左程云耗尽5年心血分享程序员代码面试指南第2版文档
  14. 希尔伯特变换的本质是什么?
  15. 使用 {}.format 对字符串进行格式(一)
  16. 将本地代码push到github上
  17. hp扫描无法选择发送到计算机,HP Officejet Pro 8600打印机无法使用扫描到计算机的功能...
  18. 给初学者推荐的10个Python免费学习网站!赶紧收藏吧!
  19. MNIST在CPU、FPGA、ARM上的运行对比
  20. LDR6290-QFN28 做Type-C台式显示器 一线通大功率PD3.0 快充与在线升级的运用

热门文章

  1. 2021年高考海淀区成绩查询,2021年北京海淀区高三期末考试区排名出炉
  2. 计算无边界云栖大会深圳峰会抢鲜报道
  3. Powerbuilder通过ODBC连接MySQL数据库
  4. JavaScript与JQuery学习笔记
  5. linux pdf中文不显示,linux下pdf中文不显示
  6. JOS lab4 Preemptive Multitasking Part B
  7. 迈普交换机 vst 配置步骤
  8. MPLS Hub-Spoke
  9. 红米10x和红米note8pro参数对比
  10. uc支持html5么,新版UC浏览器对HTML5支持度简析