iT邦幫忙

2022 iThome 鐵人賽

DAY 21
1
DevOps

其實沒有那麼難 — Docker系列 第 21

D21 - PHP 指定版本的開發環境 ft. Laravel

  • 分享至 

  • xImage
  •  

除了 Node.Js 以外,我也是一位 Laravel 的使用者,

今天的文章,獻給還在跟 Legacy Code 奮鬥的 Laravel 開發者們,

如果自己是那一位要維護舊專案的工程師,同時若是 PHP 跟 Laravel 都還在很舊的版本,有時光是連安裝開發環境就很頭痛了,
因此今天來研究,要如何在不安裝 PHP 的情況下,啟動舊版本 Laravel。


假設

假設我們要維護一個 Laravel 5.5 的舊專案,而且它原本是跑在 PHP 7.1 的環境中,

關於現在穩定的版本,Laravel 是 8 跟 9,PHP 則是 7.4 跟 8.x,

Laravel 5.5 的話其實還好處理,新版本 PHP 應該還能向下兼容,
但 PHP 7.1 就有點難辦了,我自己是用 macOS 做開發,軟體管理工具 HomeBrew 能安裝的 PHP 版本最多就只到 7.2 ,
如果要安裝 7.1,就會比較花功夫,因此我想嘗試用 Docker 來處理這個問題。

另外,如果是 JavaScript 的使用者可能會有點困惑,
「沒有像是 nvmVolta 這樣的語言版本工具嗎?」,

有是有啦...,我個人曾經試過一兩套,但就是沒那麼簡單使用,

另外,如果是使用 Windows 開發 Laravel 的讀者,也歡迎來交流你遇過的狀況或作法。

HomeBrew-PHP


目標

最後的目標是要可以不安裝 PHP 的情況下,把這個 Laravel 5.5 + PHP 7.1 的舊專案跑起來,至少要到可以開發、呼叫 API 的程度,

根據我的理解,我可以用 Docker 跑一個 PHP 7.1 的 Container,
接著用 Container 的 php 來執行 Laravel 的開發用 Server。


前置作業

因為今天是處理開發環境,因此指令都是跑在自己的開發電腦上,

首先我們要先安裝好 Docker Desktop

另外我需要產生一個 Laravel 5.5 的專案,
讀者可以到 D21-Laravel 找到範例程式碼,


建立開發環境

docker-compose.yml

直接來看 Docker Compose 的定義:

version: "3"
services:
  php-container:
    image: php:7.1
    ports:
    - 8000:8000

    # 強制 TTY 開啟,總之如果沒有加入這個設定,container 會馬上回到停止的狀態
    tty: true

    # 設定在 Container 中的預設路徑
    working_dir: /app

    # 把整個當前路徑以 Volume 綁定進 Container 中
    volumes:
      - ./:/app

啟動 container,是我們等等要拿來啟動 Laravel Server 的 container:

$ docker compose up -d

安裝依賴套件

PHP 使用 Composer 來安裝依賴的套件,並放在 vendor/ 資料夾中,
就跟 Node.Js 的 node_module/ 一樣,不會被加入版控中,所以需要來安裝,

這時我們要使用 docker compose exec 來做操作,只不過後面接著的,是我們要安裝的指令們,
被我放在一個 Shell Script 中,

如果讀者有自己的舊專案,記得自己決定要執行哪些前置的指令:

$ docker compose exec php-container  bash install.sh
# install.sh

# Install Composer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
composer --version

# Required by composer install
apt-get update
apt-get install git -y

# Install dependency
composer install

# Generate secret key
cp .env.example .env
php artisan key:generate

不過,上面這一步的執行時間意外地久,
在我的 M1 Pro 電腦上實際執行起來,大約需要 25 分鐘,我猜測是舊版本的套件下載速度很慢。

Laravel 跑起來!

最後就來到我們最重要的步驟了,

平常如果電腦上已經有需要的 PHP 環境,
要啟動 Laravel 的開發用伺服器,只要執行這個指令:

$ php artisan serve

laravel 就會在 8000 port 啟動,

但現在是在 Docker 內,一樣借助 docker compose exec:

$ docker compose exec php-container  php artisan serve --host=0.0.0.0

注意到最後面的 --host 參數,我自己也還不瞭解確切的原因,
但需要加入這個參數,API 才能正常地被 Container 外呼叫,
(Credit: Stack Overflow - How to use php artisan serve inside docker container?)

最後,打開 http://localhost:8000
終於能看到 Laravel 的歡迎畫面了!?

img

那我們今天的研究就到這邊,希望需要維護舊專案的各位,都可以順利地進行下去,
以上的程式碼範例可以在 這裡 找到。


上一篇
D20 - 團隊觀戰區爬蟲 v4 ft. Redis
下一篇
D22 - MongoDB by Docker
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言