需求是这样的,用php的laravel框架写了个小项目,要求在后面执行php artisan命令,同时有个php脚本要一直监听rabbitmq处理消息(用的swoole server),但由于公司提供的镜像中既没有crontab,也没有安装supervisor等工具,由于之前很少用到k8s,摸索了几天后终于解决了;
原创不易,转载请保留:http://www.hu-rong.com/article/536
在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); }
- 相关文章
- 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
- 我的项目
- 【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