開發的時候,都是直接在開發電腦上安裝 php, mysql, nodejs, nginx
但是要搬移到 server 的時候實在是痛苦不堪,所有的東西都要再安裝一次
php 尤其麻煩,還要安裝一堆擴充套件,要一個一個錯誤嘗試實在吐血
想要解決這個煩人的問題,當然就是服務容器化啦!
這樣以後要再次部署,但是那些 queue worker 要怎麼跑呢?放在跟主程式同一個 container 總覺得不太對勁,而且還不能平行擴展。還有那些排成怎麼辦呢?去 container 裡面設定 cronjob 嗎?
還好已經有許多強者做過這樣的操作了,我只要照著做一遍就可以了。
這裡提供我參考的網站,裡面寫得滿詳細的:Running the Laravel Scheduler and Queue with Docker
總結來說,就是讓每個 queue worker 去用跟 laravel server 一樣的設定,然後額外放一個 shell script 每 60 秒重複跑 artisan schedule:run
來達到跟原本要用 cronjob 才能做到的排程
shell script
set -e
type=${CONTAINER_TYPE:-app}
if [ "$type" = "app" ]; then
exec php-fpm
elif [ "$type" = "queue" ]; then
echo "Running the queue: default"
php artisan queue:listen redis --queue=default --sleep=3
elif [ "$type" = "scheduler" ]; then
echo "Running the scheduler"
while [ true ]
do
php artisan schedule:run >> /dev/null 2>&1 --no-interaction &
sleep 60
done
else
echo "Could not match the PHP container type \"type\""
exit 1
fi
用 `.env` 去設置每個 docker-compose 中的 service 要執行哪個邏輯
queue-worker:
build:
context: ./php
dockerfile: Dockerfile
restart: always
tty: true
working_dir: /var/www
volumes:
- ./php/app:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
- ./start.sh:/var/www/start.sh # 把指令丟進去
environment:
CONTAINER_TYPE: queue
entrypoint: [ "sh", "start.sh" ] # 啟動後執行這個命令
depends_on:
- mysql
- redis
networks:
- app
感謝其他大神讓我可以順利的將 laravel 程式容器化,也希望這篇可以幫助到正在容器化 laravel 的你 🙂