Laravelのバージョンを指定しながらDockerを利用した開発環境を作りたい

どうも、アルバイトが決まったおっさんです。
銀行口座に今月末の家賃分ほどしか入って無かったので焦っていたけど良かったです。

さて、今回の備忘録は「Laravelでwebサービスを作ってレンタルサーバーで公開する、その為の第一歩」です。

【重要】
今回も成功しません。
失敗します。
結構頑張ったのですが、失敗します。
なので、その様子を想像しながら読んで「おっさんバカかよw」と笑ってスッキリする以外の使い道は無い記事になっています。

借りているサーバー

このブログを設置しているサーバーですね。
PHPはバージョン7.4です。
そう、Laravel9はPHP8が必要だから駄目なんです。
だからPHP7.4で稼働できるLaravel8で開発環境を用意しようと思いました。

ちな、本番サーバーでもDockerを使うのってアリなんですかね?ナシ?
個人的にはそんな富豪サーバーは駄目だろって思うんですが、本番サーバーでDockerって感じのブログとかポツポツと散見されたので…どうなんだろ?
とりあえず、今回は「本番環境のサーバーにあわせたDockerを使って開発環境を作りたい!」そんな感じです!

ちなみに、おっさんが20年以上前にアダルティなサイトで作ったperl製の掲示板は、ログファイル(DBすら使ってない)が500kBを超えたあたりからスゲー重くなりましたw
「関数にしたらオーバーヘッドがー!」って言って同じコードをコピペしてましたw
そんな時代を生きてきたので、「本番でDocker!?マジでいいの!?」そんな反応になっちゃうんですよねー。

Laravelのバージョンを指定(Laravel8)して開発環境を用意する

Laravelのバージョンを指定(Laravel8)して開発環境を用意する。
これに苦労しました。
コチラの記事でも書いたように以前はcurlを使ったインストール方法を使っていました。
でも、このcurlを使った方法だとLaravelのバージョンを指定する方法が見つかりませんでした。
…どっかで解説されてそうなんですけどね~。

それでcomposerでインストールする方法を選択しました。
この方法だとバージョン指定も問題なくLaravel8がインストールされました。

composer create-project "laravel/laravel=8.*" appname

でね、分からなかったのがDockerです。
composerでインストールするとDockerを使わない形でインストールされるじゃないっすか?
※これ書いてて思ったけど、dockerを使うよう指定するオプションとかありそうねw
どうやってDockerを使わせるか、悩みました。
docker-composer.ymlを書けばいい?
ばっか!
そんな事、出来る訳ないじゃん!
おっさんだよ?俺。

でも俺、おっさんだから楽をする道ばかり考えるんですよ。
そんで、「テスト用にcurlインストールで作ったLaravelからdocker-composer.ymlをコピペしたらいいんじゃね?」って事でした。
あ、一応ymlやdocker-composer.ymlの書き方から調べてはいます。

で、コピペ!
phpのバージョンを8.1から7.4に変更(レンサバがPHP7.4なので)。
ちゃんと./vendor/laravel/sail/runtimes/にどういったバージョンがあるかは確認しましたよ!

        build:
            context: ./vendor/laravel/sail/runtimes/7.4

これでdockerで動くだろう。
次はbreezeやな。

./vendor/bin/sail php artisan breeze:install react

エラー。
あれ?

「There are no commands defined in the "breeze" namespace.」

だってさ。
なんじゃ?
で、調べた。
先にmigrateしなきゃ駄目だったっけ?
migrateもエラー。
※エラー文言、コピペし忘れたので勘弁っす

で、結局docker-composer.ymlの変更だけじゃ駄目だったんですね。
.envの修正が必要みたい(よく考えれば当たり前っすね)。
HOST系(DB_HOSTやMEMCACHED_HOST等)が127.0.0.1に指定されている。
これをdocker-compose.ymlのサービス名にする。
接続先がdockerのコンテナではなく、そのままローカルホストになってからエラーだったみたい。

#例
- DB_HOST=127.0.0.1
+ DB_HOST=mysql

ちな、試行錯誤した状態のまま進めると謎エラーになりました。
よく分からんけど。
本当は備忘録的にもログ取っとけば良かったんだけど…無念!

その頃、既にお酒も入っていたおっさんは素直にディレクトリごとrm -Rfしてイチからやり直しました。
そしたらymlのコピペと.envの修正で謎エラーは発生せずに./vendor/bin/sail php artisan breeze:installまでいけました。
だからエラーは試行錯誤のキャッシュか何かゴミが原因だった筈。
みんなも試行錯誤の末に検索しても分からんエラーに遭遇したら、全消ししてイチからやり直すといいよ!

嘘です。
インストールのコマンドが動いただけで@viteとかのディレクティブすら動いてませんでしたw

Breezeを実装するのにViteってのが必要なんやろ?

このサイトに書かれてる通りにすれば動くだろって考えました。
https://qiita.com/kon2300/items/84a854ee2b42c0d16875
プロジェクトから作り直して挑戦します。

$ composer create-project "laravel/laravel=8" test2
$ cd test2
$ ./vendor/bin/sail composer require laravel/jetstream

sailが無かった。
sailを別途インストールする場合の説明は下記サイトが分かりやすかったです。
https://chigusa-web.com/blog/laravel-to-sail/

composer require laravel/sail --dev
php artisan sail:install

インストールするサービスの選択はよく分からんかったのでmysqlのまま続行しました
これで./vendor/bin/sail up -dで動かせます。

$ ./vendor/bin/sail composer require laravel/jetstream
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires php ^7.3 but your php version (8.1.9) does not satisfy that requirement.
  Problem 2
    - fzaninotto/faker is locked to version v1.9.2 and an update of this package was not requested.
    - fzaninotto/faker v1.9.2 requires php ^5.3.3 || ^7.0 -> your php version (8.1.9) does not satisfy that requirement.  Problem 3
    - laravel/jetstream[v2.11.0, ..., 2.x-dev] require illuminate/console ^9.21 -> found illuminate/console[v9.21.0, ..., 9.x-dev] but these were not loaded, likely because it conflicts with another require.
    - Root composer.json requires laravel/jetstream ^2.11 -> satisfiable by laravel/jetstream[v2.11.0, v2.11.1, v2.11.2, 2.x-dev].

You can also try re-running composer require with an explicit version constraint, e.g. "composer require laravel/jetstream:*" to figure out if any version is installable, or "composer require laravel/jetstream:^2.1" if you know which you need.

エラー。
phpのバージョンの整合性がとれて無いっぽい?

docker-composer.ymlを修正(こないだもやったな…)
8.1ってなってるトコ2箇所を7.4に変更。
dockerを停止→起動させてからもう一度チャレンジ。

$ ./vendor/bin/sail down
$ ./vendor/bin/sail up -d
$ ./vendor/bin/sail composer require laravel/jetstream

動きました。
残りの手順で進めます。

$ ./vendor/bin/sail php artisan jetstream:install inertia
$ ./vendor/bin/sail npm install --save-dev vite @vitejs/plugin-vue
 ERROR  Failed applying laravel:vite.

  ✓  Executed action: install Node dependencies (2 actions)
  ×  Failed action: install PHP dependencies (php)
     ↪  Command failed with exit code 2: composer require --no-interaction innocenzi/laravel-vite:0.2.*
      ./composer.json has been updated
      Running composer update innocenzi/laravel-vite
      Loading composer repositories with package information
      Info from https://repo.packagist.org: #StandWithUkraine
      Updating dependencies
      Your requirements could not be resolved to an installable set of packages.

        Problem 1
          - innocenzi/laravel-vite[v0.2.0-beta.1, ..., v0.2.0-beta.29] require php ^8.0 -> your php version (7.4.30) do
es not satisfy that requirement.
          - Root composer.json requires innocenzi/laravel-vite 0.2.* -> satisfiable by innocenzi/laravel-vite[v0.2.0-be
ta.1, ..., v0.2.0-beta.29].

はい、またエラーw
頑張ってエラーを読んでいくと「innocenzi/laravel-viteはPHP8必要だけど、オマエPHP7やんけw」って感じのエラーっぽい。
「laravel/jetstreamさんがPHP7にしろ」って言うのに、どーしろって言うんだよw
でも単体インストールを試したらエラー出なかった、不思議?

$ ./vendor/bin/sail composer require innocenzi/laravel-vite

じゃー最初のコマンド通るかも。

$ ./vendor/bin/sail npm install --save-dev vite @vitejs/plugin-vue
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: undefined@undefined
npm ERR! Found: vite@2.9.15
npm ERR! node_modules/vite
npm ERR!   dev vite@"^2.9.15" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer vite@"^3.0.0" from @vitejs/plugin-vue@3.0.3
npm ERR! node_modules/@vitejs/plugin-vue
npm ERR!   dev @vitejs/plugin-vue@"*" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR! See /home/sail/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/sail/.npm/_logs/2022-08-27T07_23_38_780Z-debug-0.log

少しはエラーにも慣れてきました。
package.jsonのviteのバージョン指定を^3.0.0に変更して再挑戦。

$ ./vendor/bin/sail npm install --save-dev vite @vitejs/plugin-vue

エラー出ない!!!!

さて、元サイトによればこれで良いはず。

$ ./vendor/bin/sail up -d
$ ./vendor/bin/sail npm run dev
error when starting dev server:
Error: [vite:laravel:config] Could not read configuration: The configuration object do not contain a "configs" property. Is innocenzi/laravel-vite up-to-date?
    at readConfig (/var/www/html/node_modules/vite-plugin-laravel/dist/index.cjs:331:11)
    at Object.config (/var/www/html/node_modules/vite-plugin-laravel/dist/index.cjs:194:22)
    at resolveConfig (file:///var/www/html/node_modules/vite/dist/node/chunks/dep-0fc8e132.js:62629:33)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async createServer (file:///var/www/html/node_modules/vite/dist/node/chunks/dep-0fc8e132.js:59183:20)
    at async CAC.<anonymous> (file:///var/www/html/node_modules/vite/dist/node/cli.js:699:24)

またエラーかよぉぉぉ!
うーん、innocenzi/laravel-viteが設定が読めないのかな?
よく分からん。

もう長いので省略しますがテキトーに試しました。

$ vi vite.config.ts
import vue from '@vitejs/plugin-vue'

export default defineConfig({
	plugins: [
		vue(),
# って感じでvite.config.tsにvue用のを追加。

$ ./vendor/bin/sail php artisan vendor:publish --tag=vite-config

やっぱりだめw
もうヤケクソです。
configsが欲しいんだろ!ってconfig/vite.phpに ‘configs’=>[],ってテキトーに追加してnpm run dev!

$ ./vendor/bin/sail npm run dev
error when starting dev server:
TypeError: Cannot read properties of undefined (reading 'url')
~以下略~

エラー内容が変わったw
でもurlなんてプロパティはvite.config.tsやconfig/vite.phpのどちらにも見つからん…オワオワタ。

結論

これ、結果から言うとPHP7.4のサーバーでBreezeを使う事が間違いっぽいです!
今のBreezeはViteを使う。
ViteはPHP8が必要。
なのでPHP7系のサーバーでLaravelを使うならLaravel8かつBreeze以外のスターターキット(Viteを使わない)じゃないと駄目っぽいですね。
laravel-viteのサイト参照
※最下部の「The Laravel package requires PHP 8.0 or greater.」って…そういう事だよね?

何やってたんだろうね、自分は。
とりあえず、明日以降にBreeze以外のスターターキットで試してみようと思います。
もう疲れたからお酒飲むわ。

と思っていたけど、面倒くさくなり過ぎてレンサバのPHPをバージョン8に上げてやったw
これでLaravel9でもいいだろ。
しかし…外注とかだとサーバーのPHPのバージョンが決まってる事もあるだろうし…どうしてんだろ?本気で分からんす。

試行錯誤の際に使った覚えておきたいコマンド

docker ps

起動してるコンテナを確認出来る。
sail up時に出るエラーのport is already allocated対策ですね。
docker desktopのContainersには何も出てなかったのに、コイツだと出たので大事っぽい。
と、思ったけど、docker desktopの「Search」に謎ワードが入力されてたのが何も出ていない原因でしたw
docker desktop使うなら不要かも。
あ、出てきたコンテナを殺す時はdocker kill コンテナIDでいいみたいです。

ss -atn

サーバーのポート待ち受けの確認コマンド。
これもsail up時に出るエラーのport is already allocated対策ですね。
何か、ポート確認のコマンドとか毎回調べてるような記憶しかないです。
頻繁に使うコマンドでも無いので…おっさんには仕方ないよね。

他にも何かあったような気がしますが…忘れた!!
こうやって書く事で少しでも記憶に残るようにします。

コメント

タイトルとURLをコピーしました