在k8s启动docker容器后循环在后台运行shell脚本
首页->学习资料->微服务治理->docker 关键词: 发布时间:2021-05-19 01:22:23 浏览次数:3336

需求是这样的,用php的laravel框架写了个小项目,要求在后面执行php artisan命令,同时有个php脚本要一直监听rabbitmq处理消息(用的swoole server),但由于公司提供的镜像中既没有crontab,也没有安装supervisor等工具,由于之前很少用到k8s,摸索了几天后终于解决了;

原创不易,转载请保留:http://www.hu-rong.com/article/536


image.png


在k8s的Deployments的配置中加入command:

kind: Deployment

apiVersion: apps/v1

metadata:

  name: taibao-api

  namespace: autocall-test

  selfLink: /apis/apps/v1/namespaces/autocall-test/deployments/taibao-api

  uid: a15d5385-e38c-4b79-93d2-7761904c5f06

  resourceVersion: '7058731457'

  generation: 19

  creationTimestamp: '2021-05-19T07:48:31Z'

  labels:

    name: taibao-api

  annotations:

    deployment.kubernetes.io/revision: '19'

    kubectl.kubernetes.io/last-applied-configuration: >

      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"name":"taibao-api"},"name":"taibao-api","namespace":"autocall-test"},"spec":{"minReadySeconds":10,"replicas":1,"revisionHistoryLimit":3,"selector":{"matchLabels":{"name":"taibao-api"}},"strategy":{"rollingUpdate":{"maxSurge":"25%","maxUnavailable":"25%"},"type":"RollingUpdate"},"template":{"metadata":{"creationTimestamp":null,"labels":{"name":"taibao-api"}},"spec":{"containers":[{"env":[{"name":"ARGS","value":null},{"name":"aliyun_logs_taibao-api","value":"stdout"},{"name":"logtail","value":"taibao-api"},{"name":"POD_NAME","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"metadata.name"}}},{"name":"POD_NAMESPACE","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"metadata.namespace"}}},{"name":"POD_IP","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"status.podIP"}}},{"name":"HOST_IP","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"status.hostIP"}}}],"image":"registry-vpc.cn-beijing.aliyuncs.com/icsoc/taibao-api:taibao-api-2021_05_19-19_43_56","imagePullPolicy":"Always","name":"taibao-api","ports":[{"containerPort":80,"name":"web","protocol":"TCP"}],"resources":{"limits":{"cpu":"1024m","memory":"2048Mi"},"requests":{"cpu":"500m","memory":"1200Mi"}},"volumeMounts":[{"mountPath":"/www/.env","name":"taibao-api-cm","subPath":".env"}]}],"dnsPolicy":"ClusterFirst","imagePullSecrets":[{"name":"autocall-test"}],"restartPolicy":"Always","terminationGracePeriodSeconds":60,"volumes":[{"configMap":{"defaultMode":420,"name":"taibao-api-cm"},"name":"taibao-api-cm"}]}}}}

spec:

  replicas: 1

  selector:

    matchLabels:

      name: taibao-api

  template:

    metadata:

      creationTimestamp: null

      labels:

        name: taibao-api

    spec:

      volumes:

        - name: taibao-api-cm

          configMap:

            name: taibao-api-cm

            defaultMode: 420

      containers:

        - name: taibao-api

          image: >-

            registry-vpc.cn-beijing.aliyuncs.comxxxxxxxxxxxxxxxxxxxxxxxx

          command:

            - /bin/sh

          args:

            - '-c'

            - sh /data/www/crontab.sh

          ports:

            - name: web

              containerPort: 80

              protocol: TCP

          volumeMounts:

            - name: taibao-api-cm

              mountPath: /www/.env

              subPath: .env

            - name: taibao-api-cm

              mountPath: /data/www/.env

              subPath: .env


建一个shell脚本crontab.sh放到项目根目录中,容器启动后将挂载到/data/www/crontab.sh,脚本内容如下:

#/bin/sh

while(true)

do

    time=$(date "+%Y-%m-%d %H:%M:%S")

    echo $time >> crontab.txt

    /usr/local/bin/php /data/www/artisan schedule:run  >> crontab.txt

echo artisan-end >> crontab.txt

    sleep 1

done



当容器启动后将每隔一秒:

输出当前时间到项目根目录下的crontab.txt中,

同时每隔一分钟执行php artisan命令,且执行信息也会写入到crontab.txt中,

最后写入artisan-end到crontab.txt中


这样即使swoole服务挂了,一秒后也会重新启动;



还有一种用api的方式,写一个接口执行一下shell_exec,定时去请求:


/**
 * k8s api方式实现定时php artisan
 */
public function artisan()
{
    $file = dirname(dirname(dirname(dirname(dirname(dirname(__FILE__)))))) . '/k8s.txt';
    $time = date('Y-m-d H:i:s', time()) . "\n";
    file_put_contents($file, $time, FILE_APPEND);
    shell_exec("chmod -R 777 /data/www/storage");
    shell_exec("/usr/local/bin/php /data/www/artisan schedule:run  >> " . $file);
    file_put_contents($file, "k8s done\n", FILE_APPEND);
}


赞:(0)
踩:(0)
相关文章
docker容器中开启php扩展,制成新镜
docker容器中安装扩展后制成新镜像
如何在docker容器外执行php artisa
docker容器如何执行composer insta
docker容器内无法上网ping不通外网
将docker中的文件拷贝到docker外
docker中nginx可以访问html无法访
docker容器中安装amqp扩展
docker安装及入门教程
centos7上安装docker
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:942448
粤ICP备18028092号-1  微信:hurong241