【Docker】Dockerfile参数速查-程序员宅基地

技术标签: 运维  linux  docker  

目录

常用参数  

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 <[email protected]>"

 这将添加一个名为 maintainer 的元数据标签,其值为 John Doe <[email protected]>

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 下仍然能够正常工作。


参考文章:


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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38238956/article/details/129927940

智能推荐

从零开始搭建Hadoop_创建一个hadoop项目-程序员宅基地

文章浏览阅读331次。第一部分:准备工作1 安装虚拟机2 安装centos73 安装JDK以上三步是准备工作,至此已经完成一台已安装JDK的主机第二部分:准备3台虚拟机以下所有工作最好都在root权限下操作1 克隆上面已经有一台虚拟机了,现在对master进行克隆,克隆出另外2台子机;1.1 进行克隆21.2 下一步1.3 下一步1.4 下一步1.5 根据子机需要,命名和安装路径1.6 ..._创建一个hadoop项目

心脏滴血漏洞HeartBleed CVE-2014-0160深入代码层面的分析_heartbleed代码分析-程序员宅基地

文章浏览阅读1.7k次。心脏滴血漏洞HeartBleed CVE-2014-0160 是由heartbeat功能引入的,本文从深入码层面的分析该漏洞产生的原因_heartbleed代码分析

java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)-程序员宅基地

文章浏览阅读1.4k次。前言ofd是国家文档标准,其对标的文档格式是pdf。ofd文档是容器格式文件,ofd其实就是压缩包。将ofd文件后缀改为.zip,解压后可看到文件包含的内容。ofd文件分析工具下载:点我下载。ofd文件解压后,可以看到如下内容: 对于xml文件,可以用文本工具查看。但是对于印章文件(Seal.esl)、签名文件(SignedValue.dat)就无法查看其内容了。本人开发一款ofd内容查看器,..._signedvalue.dat

基于FPGA的数据采集系统(一)_基于fpga的信息采集-程序员宅基地

文章浏览阅读1.8w次,点赞29次,收藏313次。整体系统设计本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下:图1:FPGA数据采集系统框图从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D.._基于fpga的信息采集

微服务 spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL-程序员宅基地

文章浏览阅读2.5w次。1.背景错误信息:-- [http-nio-9904-exec-5] o.s.c.n.z.filters.post.SendErrorFilter : Error during filteringcom.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud..._com.netflix.zuul.exception.zuulexception

邻接矩阵-建立图-程序员宅基地

文章浏览阅读358次。1.介绍图的相关概念  图是由顶点的有穷非空集和一个描述顶点之间关系-边(或者弧)的集合组成。通常,图中的数据元素被称为顶点,顶点间的关系用边表示,图通常用字母G表示,图的顶点通常用字母V表示,所以图可以定义为:  G=(V,E)其中,V(G)是图中顶点的有穷非空集合,E(G)是V(G)中顶点的边的有穷集合1.1 无向图:图中任意两个顶点构成的边是没有方向的1.2 有向图:图中..._给定一个邻接矩阵未必能够造出一个图

随便推点

MDT2012部署系列之11 WDS安装与配置-程序员宅基地

文章浏览阅读321次。(十二)、WDS服务器安装通过前面的测试我们会发现,每次安装的时候需要加域光盘映像,这是一个比较麻烦的事情,试想一个上万个的公司,你天天带着一个光盘与光驱去给别人装系统,这将是一个多么痛苦的事情啊,有什么方法可以解决这个问题了?答案是肯定的,下面我们就来简单说一下。WDS服务器,它是Windows自带的一个免费的基于系统本身角色的一个功能,它主要提供一种简单、安全的通过网络快速、远程将Window..._doc server2012上通过wds+mdt无人值守部署win11系统.doc

python--xlrd/xlwt/xlutils_xlutils模块可以读xlsx吗-程序员宅基地

文章浏览阅读219次。python–xlrd/xlwt/xlutilsxlrd只能读取,不能改,支持 xlsx和xls 格式xlwt只能改,不能读xlwt只能保存为.xls格式xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改xlrd打开文件import xlrdexcel=xlrd.open_workbook('E:/test.xlsx') 返回值为xlrd.book.Book对象,不能修改获取sheett_xlutils模块可以读xlsx吗

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题_unresolved attribute reference 'find_element_by_id-程序员宅基地

文章浏览阅读8.2w次,点赞267次,收藏656次。运行Selenium出现'WebDriver' object has no attribute 'find_element_by_id'或AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'等定位元素代码错误,是因为selenium更新到了新的版本,以前的一些语法经过改动。..............._unresolved attribute reference 'find_element_by_id' for class 'webdriver

DOM对象转换成jQuery对象转换与子页面获取父页面DOM对象-程序员宅基地

文章浏览阅读198次。一:模态窗口//父页面JSwindow.showModalDialog(ifrmehref, window, 'dialogWidth:550px;dialogHeight:150px;help:no;resizable:no;status:no');//子页面获取父页面DOM对象//window.showModalDialog的DOM对象var v=parentWin..._jquery获取父window下的dom对象

什么是算法?-程序员宅基地

文章浏览阅读1.7w次,点赞15次,收藏129次。算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵 魂。二、算法的特征1.可行性 算法中执行的任何计算步骤都可以分解为基本可执行的操作步,即每个计算步都可以在有限时间里完成(也称之为有效性) 算法的每一步都要有确切的意义,不能有二义性。例如“增加x的值”,并没有说增加多少,计算机就无法执行明确的运算。 _算法

【网络安全】网络安全的标准和规范_网络安全标准规范-程序员宅基地

文章浏览阅读1.5k次,点赞18次,收藏26次。网络安全的标准和规范是网络安全领域的重要组成部分。它们为网络安全提供了技术依据,规定了网络安全的技术要求和操作方式,帮助我们构建安全的网络环境。下面,我们将详细介绍一些主要的网络安全标准和规范,以及它们在实际操作中的应用。_网络安全标准规范