Laravel 服務容器化

開發的時候,都是直接在開發電腦上安裝 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 的你 🙂

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *