dockerfile健康检查HEALTHCHECK的命令学习
作者:潇洒哥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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!