dockerfile健康检查HEALTHCHECK的命令学习

 更新时间:2024年01月04日 15:59:45   作者:潇洒哥Kahn  
HEALTHCHECK 指令告诉 Docker 如何测试一个容器,以检查它是否仍在工作,本文主要介绍了dockerfile健康检查HEALTHCHECK的命令学习,感兴趣的可以了解一下

语法形式:

  • HEALTHCHECK [OPTIONS] CMD command (通过在容器中运行一个命令执行健康检查)
  • HEALTHCHECK NONE (禁用从基本镜像继承的任何健康检查)

1、dockerfile示例

FROM registry.access.redhat.com/ubi9/ubi-init
#关闭订阅管理器功能,便于使用dnf安装软件RUN sed -i 's/d=1/d=0/' /etc/yum/pluginconf.d/subscription-manager.conf
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
#安装必要的软件
RUN dnf -y install wget tcpdump tzdata bind-utils;dnf clean all;dnf makecache
#将本地jdk压缩包上传至镜像内,它会自动解压
ADD ./jdk-8u212-linux-x64.tar.gz /usr/local/
ADD ./apache-tomcat-8.0.26.tar.gz /usr/local/
ADD ./node_exporter /usr/bin/
#设置时区和jdk的软链
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone;ln -sf /usr/local/jdk1.8.0_212/bin/java /usr/bin/java
RUN echo "sh /usr/local/apache-tomcat-8.0.26/bin/startup.sh" >> /etc/profile
WORKDIR /data
ADD ./run_tomcat_exporter.sh /data/run_tomcat_exporter.sh
EXPOSE 9100 8080
ENV JAVA_HOME /usr/local/jdk1.8.0_212
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.26
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.26
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
ENV girl="serena" EXPORTER_PORT=9100
#HEALTHCHECK --interval=5s --timeout=3s --retries=3 CMD curl --fail http://localhost:$EXPORTER_PORT || exit 1   #即使探测到端口是unhealthy也不会重启容器,仅在docker ps里标记这个docker进程为unhealthy
HEALTHCHECK --interval=5s --timeout=3s --retries=3 CMD curl --fail http://localhost:$EXPORTER_PORT || bash -c 'kill -s 15 -1 && (sleep 10; kill -s 9 -1)'
#运行exporter
CMD sh /data/run_tomcat_exporter.sh

注:这个示例中跑了 exporter 9100 和tomcat 8080。使用脚本/data/run_tomcat_exporter.sh 一次性启动这两个应用。

2、启动脚本

#!/usr/bin/env bash

sh /usr/local/apache-tomcat-8.0.26/bin/startup.sh
/usr/bin/node_exporter
sleep 36000000

3、构建镜像

docker build -t myubi:1.0 .

4、运行容器

docker run -d --restart=always --name=myubi -p 19100:9100 -p 18080:8080 myubi:1.0

 注:可使用宿主机访问容器应用,如http://宿主机ip:18080/ 和 http://宿主机ip:19100/metrics

5、进容器内部尝试kill掉健康检查的exporter进程

[root@k8s-node2 ubi]# docker exec -it myubi sh
sh-5.1# 
sh-5.1# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 09:58 ?        00:00:00 sh /data/run_tomcat_exporter.sh
root         14      1  7 09:58 ?        00:00:01 /usr/local/jdk1.8.0_212/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.26/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.Cla
root         15      1  0 09:58 ?        00:00:00 /usr/bin/node_exporter
root         67      0  0 09:58 pts/0    00:00:00 sh
root         82     67  0 09:58 pts/0    00:00:00 ps -ef
sh-5.1# 
sh-5.1# kill -9 15
sh-5.1# 此时容器自动退出重启了

6、小结

6-1、健康检查中使用exit 1只能让容器的状态为 unhealthy

HEALTHCHECK --interval=5s --timeout=3s --retries=3 CMD curl --fail http://localhost:$EXPORTER_PORT || exit 1

6-2、健康检查中使用bash -c 'kill -s 15 -1 && (sleep 10; kill -s 9 -1)' 能让容器重启

HEALTHCHECK --interval=5s --timeout=3s --retries=3 CMD curl --fail http://localhost:$EXPORTER_PORT || bash -c 'kill -s 15 -1 && (sleep 10; kill -s 9 -1)'

因为kill -s 9 -1 就是杀掉容器的主进程1。如果主进程1不存在了,那么容器也就挂了。

配合运行容器的命令--restart=always 则容器检测到主进程1不存在了就回重启容器。

到此这篇关于dockerfile健康检查HEALTHCHECK的命令学习的文章就介绍到这了,更多相关dockerfile健康检查HEALTHCHECK内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker容器数据卷的使用教程

    Docker容器数据卷的使用教程

    数据卷容器是一个专门用来挂载数据卷的容器,该容器主要是供其他容器引用和使用,下面这篇文章主要给大家介绍了关于Docker容器数据卷使用的相关资料,需要的朋友可以参考下
    2022-10-10
  • Docker 运行时的用户与组管理的方法

    Docker 运行时的用户与组管理的方法

    这篇文章主要介绍了Docker 运行时的用户与组管理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Docker 常用命令整理(实用篇)

    Docker 常用命令整理(实用篇)

    这篇文章主要介绍了Docker 常用命令整理,需要的朋友可以参考下
    2017-02-02
  • Docker compose一键安装mirai搭建QQ机器人最快操作方法

    Docker compose一键安装mirai搭建QQ机器人最快操作方法

    这篇文章主要介绍了Docker compose一键安装mirai,搭建QQ机器人最快方法,详细介绍了mirai基本操作,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 查询Docker镜像DockerFile的方法步骤

    查询Docker镜像DockerFile的方法步骤

    本文主要介绍了查询Docker镜像DockerFile的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Docker Nginx Log 三者的处理详解

    Docker Nginx Log 三者的处理详解

    这篇文章主要介绍了Docker Nginx Log 三者的处理详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Docker实现挂载的方式汇总

    Docker实现挂载的方式汇总

    Docker实现挂载有多种方式,下面给大家分享Docker实现挂载常见方式,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • 在Docker中的ubuntu中安装Python3和Pip的问题

    在Docker中的ubuntu中安装Python3和Pip的问题

    这篇文章主要介绍了在Docker中的ubuntu中安装Python3和Pip的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 聊聊Docker不适合跑 MySQL 的N个原因

    聊聊Docker不适合跑 MySQL 的N个原因

    容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题,这篇文章主要介绍了Docker 为什么不适合跑 MySQL?有N个原因,需要的朋友可以参考下
    2022-12-12
  • Docker mysql+nacos单机部署的实现步骤

    Docker mysql+nacos单机部署的实现步骤

    本文主要介绍了Docker mysql+nacos单机部署的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08

最新评论