【Docker基础】Dockerfile指令速览:高级构建指令详解
目录
引言
1 ONBUILD:为子镜像预留指令
1.1 指令简介
1.2 语法
1.3 使用场景
1.4 应用流程
1.5 示例
1.6 注意事项
2 STOPSIGNAL:指定容器停止信号
2.1 指令简介
2.2 语法
2.3 使用场景
2.4 应用流程
2.5 示例
2.6 注意事项
3 SHELL:指定默认的Shell
3.1 指令简介
3.2 语法
3.3 使用场景
3.4 应用流程
3.5 示例
3.6 注意事项
4 总结
引言
在构建Docker镜像的过程中,除了基础指令外,还有一些高级指令能够提供更灵活和强大的功能。这些指令虽然不常用,但在特定场景下能够显著提升构建过程的效率和镜像的灵活性。本文将探讨Dockerfile中的三个高级构建指令:
- ONBUILD
- STOPSIGNAL
- SHELL
1 ONBUILD:为子镜像预留指令
1.1 指令简介
ONBUILD指令用于在当前镜像被用作其他镜像的基础镜像时,执行预留的指令。它类似于一种“触发器”,在子镜像构建过程中自动执行指定的指令。
1.2 语法
ONBUILD <INSTRUCTION>
- :任何有效的Dockerfile指令,如COPY, RUN, ENV等
1.3 使用场景
- 构建框架镜像:创建一个基础镜像,作为其他镜像的构建框架,预留一些构建步骤
- 代码注入:在子镜像构建过程中自动注入代码或配置
- 自动化构建:实现构建过程的自动化,减少重复工作
1.4 应用流程

- 定义ONBUILD指令:在当前Dockerfile中使用ONBUILD指令定义预留的指令
- 基础镜像被用作其他镜像的基础?:判断当前镜像是否被用作其他镜像的基础镜像
- 子镜像构建时触发ONBUILD指令:如果当前镜像被用作基础镜像,子镜像在构建过程中会触发ONBUILD指令
- 执行预留的指令:执行ONBUILD指令中定义的指令
- 完成子镜像构建:子镜像完成构建过程
1.5 示例
# 基础镜像Dockerfile
FROM ubuntu:18.04
ONBUILD COPY . /app
ONBUILD RUN cd /app && make
- 在上述示例中,当这个基础镜像被用作其他镜像的基础时,子镜像的构建过程中会自动执行COPY . /app和RUN cd /app && make指令
1.6 注意事项
- 触发条件:ONBUILD指令只有在当前镜像被用作其他镜像的基础镜像时才会触发
- 避免循环触发:不要在ONBUILD指令中再次使用ONBUILD,以避免无限循环
2 STOPSIGNAL:指定容器停止信号
2.1 指令简介
- STOPSIGNAL指令用于指定容器停止时发送给容器的系统调用信号
- 默认情况下,Docker使用SIGTERM信号来优雅地停止容器
- 如果需要使用其他信号,可以通过STOPSIGNAL指令进行指定
2.2 语法
STOPSIGNAL <signal>
- :信号名称或信号编号,如SIGKILL, 9等
2.3 使用场景
- 自定义停止行为:根据应用需求,自定义容器的停止信号
- 确保数据完整性:在停止容器前执行特定的操作,确保数据完整性
2.4 应用流程

- 指定停止信号:在Dockerfile中使用STOPSIGNAL指令指定容器停止时发送的信号
- 使用信号名称还是编号?:判断使用信号名称还是信号编号
- 使用信号名称:如果使用信号名称,如SIGTERM, SIGKILL等
- 使用信号编号:如果使用信号编号,如9, 15等
- 容器接收到信号后执行停止操作:容器接收到指定的信号后,执行相应的停止操作
- 应用优雅地停止:应用根据信号类型,优雅地停止运行,确保数据完整性和一致性
2.5 示例
STOPSIGNAL SIGKILL
2.6 注意事项
- 信号选择:选择合适的信号,确保容器能够优雅地停止,避免数据丢失或状态不一致
- 默认信号:如果不指定STOPSIGNAL,Docker默认使用SIGTERM信号
3 SHELL:指定默认的Shell
3.1 指令简介
- SHELL指令用于指定在RUN, CMD, ENTRYPOINT等指令中使用的默认Shell
- 默认情况下,Docker使用/bin/sh -c作为Shell,
- 通过SHELL指令,可以更改默认的Shell,如使用/bin/bash或其他Shell
3.2 语法
SHELL ["executable", "param1", "param2"]
- executable:Shell可执行文件的路径,如/bin/bash
- param1, param2:Shell的参数
3.3 使用场景
- 使用特定Shell:根据应用需求,使用特定的Shell,如/bin/bash
- 自定义Shell参数:传递特定的参数给Shell,如--login等
3.4 应用流程

- 指定默认Shell:在Dockerfile中使用SHELL指令指定默认的Shell
- 使用SHELL指令?:判断是否使用SHELL指令
- 设置新的默认Shell:如果使用SHELL指令,设置新的默认Shell
- 使用默认的/bin/sh -c:如果不使用SHELL指令,使用默认的/bin/sh -c
- 后续指令使用新的Shell:所有后续的RUN, CMD, ENTRYPOINT等指令将使用新的Shell
- 执行Shell命令:执行Shell命令时,使用指定的Shell
3.5 示例
SHELL ["/bin/bash", "-c"]
RUN echo "Hello, World!"
- 在上述示例中,RUN指令将使用/bin/bash -c来执行命令
3.6 注意事项
- Shell选择:选择合适的Shell,确保命令能够正确执行
- 兼容性:确保所选Shell在基础镜像中存在,避免构建失败
4 总结
ONBUILD、STOPSIGNAL和SHELL是Dockerfile中用于高级构建过程的关键指令,掌握这些指令的使用方法和最佳实践,可以帮助我们构建更加灵活、可维护和高效的Docker镜像。通过合理地使用这些高级指令,可以显著提升构建过程的自动化程度和镜像的灵活性。