カテゴリー
Linux コンピューター

[hadolint] warning: Pin versions in apt get install. Instead of apt-get install use apt-get install = (DL3008) を正当な修正をして黙らせるまでの手順メモ

エラー詳細

DL3008 · hadolint/hadolint Wiki · GitHub

Docker イメージにパッケージをインストールするときに、バージョンが決め手になることは全然ないのですが、それだと hadolint が警告を出してきました。

無視したり、警告を抑制しても良いのですけれども、パッケージのバージョンをできるだけ細かく指定するべき、というのは、まあそうだよね、と思いましたので対応することにいたしました。

今回の例で取り上げるパッケージ

unzip 、および libpq-dev にバージョンを指定していないので、これらを例に取り上げます。もともと、この警告に対応してバージョンを明記していたのですけれども、久しぶりに Docker イメージのビルドを行ったところ、そんなバージョンは無い、と言われてしまったので、今回の投稿に繋がった背景もあります。そもそも、このようなケースの場合、バージョン指定などしなくてもよさそうな気もします。。。

対応流れまとめ。

  1. バージョン指定をしないまま、最新のパッケージを Docker イメージにインストールする。
  2. コンテナを立ち上げ、インストールしたパッケージのバージョンを調べる。
  3. Dockerfile に調べたバージョンをコピペする。

このうち、最初の手順である、 Docker イメージへの問題となるバージョン未設定パッケージのインストールは完了しているところから始まります。

修正対象のコード部分

RUN apt-get update && apt-get install -y --no-install-recommends \
  libicu-dev=67.1-7 \
  libjpeg-dev=1:2.0.6-4 \
  libpng-dev=1.6.37-3 \
  libpq-dev \
  libzip-dev=1.7.3-1 \
  unzip \
  && apt-get clean && rm -rf /var/lib/apt/lists/* \
  && docker-php-ext-configure \
  gd --with-jpeg \
  && docker-php-ext-install \
  bcmath \
  gd \
  intl \
  pdo_mysql \
  pdo_pgsql \
  zip

そもそも、Debian の場合、パッケージのバージョンの確認はどうやったらできるのだろう?

php:8.1.9-apache イメージを使っていますけれども、これは一体どんな Linux ディストロビューションを使っているのでしょうか? 結構な頻度で調べています。。。

php – Official Image | Docker Hub のページから、 docs/README.md at master · docker-library/docs · GitHub へとび、さらに php/Dockerfile at 1eda47a53c9c23c906c53148c0d6f3f88232e572 · docker-library/php · GitHub へ行くと、 Debian ということがわかります。

念の為、確認してみました。

app@2da372626249:/var/www/html/laravel$ cat /etc/issue
Debian GNU/Linux 11 \n \l

app@2da372626249:/var/www/html/laravel$ 

確かに、 Debian でした。

問題となるバージョン未設定パッケージのバージョンを調べる方法と実践

次に、 Debian でのパッケージバージョンを調べる方法を調べました。

apt-cache policy を使います。

root@2da372626249:/var/www/html/laravel# apt-get update
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:4 http://deb.debian.org/debian bullseye/main amd64 Packages [8184 kB]
Get:5 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages [186 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [6344 B]
Fetched 8585 kB in 5s (1642 kB/s)                         
Reading package lists... Done
root@2da372626249:/var/www/html/laravel# 
root@2da372626249:/var/www/html/laravel# 
root@2da372626249:/var/www/html/laravel# 
root@2da372626249:/var/www/html/laravel# apt-cache policy libpq-dev unzip
libpq-dev:
  Installed: 13.8-0+deb11u1
  Candidate: 13.8-0+deb11u1
  Version table:
 *** 13.8-0+deb11u1 500
        500 http://deb.debian.org/debian bullseye/main amd64 Packages
        100 /var/lib/dpkg/status
     13.7-0+deb11u1 500
        500 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages
unzip:
  Installed: 6.0-26+deb11u1
  Candidate: 6.0-26+deb11u1
  Version table:
 *** 6.0-26+deb11u1 500
        500 http://deb.debian.org/debian bullseye/main amd64 Packages
        500 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages
        100 /var/lib/dpkg/status
root@2da372626249:/var/www/html/laravel# 

セマンティック バージョニング 2.0.0 | Semantic Versioning でバージョニングされていると思い込んでおりましたが、そうでもないようです。とにかく、 Installed の部分をコピーして、バージョンを得ることができました。

Dockerfile 修正して、バージョンを指定したもの

RUN apt-get update && apt-get install -y --no-install-recommends \
  libicu-dev=67.1-7 \
  libjpeg-dev=1:2.0.6-4 \
  libpng-dev=1.6.37-3 \
  libpq-dev \
  libzip-dev=1.7.3-1 \
  unzip \
  && apt-get clean && rm -rf /var/lib/apt/lists/* \
  && docker-php-ext-configure \
  gd --with-jpeg \
  && docker-php-ext-install \
  bcmath \
  gd \
  intl \
  pdo_mysql \
  pdo_pgsql \
  zip

おわりに

バージョンをワイルドカードを使って緩やかに指定することもできるようです。

  • RUN apt-get Best practices for writing Dockerfiles | Docker Documentation

    You can also achieve cache-busting by specifying a package version. This is known as version pinning, for example:

    RUN apt-get update && apt-get install -y \
        package-bar \
        package-baz \
        package-foo=1.3.*
    

    Version pinning forces the build to retrieve a particular version regardless of what’s in the cache. This technique can also reduce failures due to unanticipated changes in required packages.

ここまで来て、思い違いをしていたことに気がつきました。上記引用のベストプラクティスでは、 キャッシュ無効化を有効活用する観点から、バージョンを指定するべき 、とのこと。バージョンを細かく指定することが目的、では無かったです。よって、大雑把にメジャーバージョンの指定だけであとはワイルドカードにする、という決定でも、それで問題がなければよさそうです。

また、そもそも警告だし、メインとなるパッケージ以外はそこまでバージョンにこだわる必要がない、と割り切る場合は、警告を抑制する方法もありだと思います。

ただ単に方法を調べるだけではなく、投稿を書いていく中で考えを深めることができました。とても嬉しく感じたところで♪、以上です。

カテゴリー
Linux コンピューター

【Laravel9 Vite Vue.js 3】 Swiper でサムネイル付きのスライドショー SFC を作成する記録

やりたいこと

  • Vue.js 3
  • Swiper の SFC への入力
    • 画像 URL の配列
  • Swiper の SFC からの出力
    • 特になし。
    • スライドショー、フォトギャラリーがウェブブラウザに描画される
      • サムネイルあり
カテゴリー
Linux コンピューター

WLS2 の Docker コンテナ内の Laravel9.2 Vite SPA 。 `npm run dev` 時に Docker ホストのウェブブラウザからコンテナ内の Vite 開発サーバに繋がるようにした記録

直面した問題

環境

npm run prod の場合は、静的ファイルを書き出してそのファイルへのリンクを HTML ファイルへ埋め込むようになっています。よって、ビルドされたファイルへのリンクは Laravel へアクセスするときの Apache なり Nginx なり PHP ビルトインサーバなりの URL と同じ URL が埋め込まれ、この URL でアクセスできるため問題はありません。

一方で、 npm run dev の場合は、 Vite の開発サーバが別途立ち上がります。そして Vite でビルドされたファイルへアクセスするための埋め込みリンクは、 Vite の開発サーバの URL となります。 Docker を使う場合、 Docker ホスト側から Docker コンテナ内の Vite 開発サーバへどうやってアクセスするのかが、問題になりました。

例えば、カスタマイズしていない vite.config.jsnpm run dev すると次のようになります。

  1. URL は次のように表示された。
    • VITE ➜ Local: http://localhost:5173/
    • LARAVEL ➜ APP_URL: http://localhost
  2. Docker ホストにて、ウェブブラウザで http://localhost/ にアクセスすると画面真っ白になった。
  3. ページのソースコードを見てみると、 Vite でビルドされたファイルへのリンクは <script type="module" src="http://127.0.0.1:5173/resources/js/app.js"></script> となっていた。この URL にアクセスしてみても ERR_CONNECTION_REFUSED のエラーページとなった。
  4. Docker コンテナの port に "5173:5173" を追加し、再度 http://127.0.0.1:5173 へのアクセスを試したところ、異なるエラー ERR_EMPTY_RESPONSE となったもののやはりエラーページとなった。

今回、これを解決しましたのでメモいたします。

カテゴリー
コンピューター

Google Chrome に怒られない開発用途限定の自己署名なSSLサーバ証明書をコマンド一発で作る方法

コマンド

# サーバ証明書 (および秘密鍵) の作成
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
-keyout private_key.pem \
-out certificate.pem \
-config - <<EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = usr_cert
prompt = no

[req_distinguished_name]
C = JP
O = oki2a24.com
OU = MyDivision
CN = localhost

[usr_cert]
basicConstraints = critical, CA:FALSE
subjectAltName = DNS:localhost
EOF

# サーバ証明書の確認
openssl x509 -text -noout -in certificate.pem

使用したバージョン

root@495db3743f1d:/var/www/html# openssl version
OpenSSL 1.1.1n  15 Mar 2022
root@495db3743f1d:/var/www/html# 

まとめ・ポイント

カテゴリー
Linux

nunomaduro/larastan 1.0.3 で Laravel 8 の無編集のソースコードへのエラーに対応したメモ

まとめ

  • composer update nunomaduro/larastan:^1.0 --dev でアップデートしたところ、 Laravel インストールして生成された無編集のソースコードでエラーが発生した、
  • https://github.com/laravel/laravel/blob/8.x/app から最新ソースコードを適用することで解決したエラーもあった。
  • どうしても解決できないものは、 Ignoring Errors | PHPStan を参考にエラー抑制した。
カテゴリー
Linux

Laravel 8 、 Larastan 1.0.3 。API リソースクラスに対してプロパティが無いエラー、例えば Access to an undefined property App\Http\Resources\UserResource::$id. に対応する方法メモ

対応方法まとめ

  • その1
    • API リソースクラスの toArray メソッド冒頭に、例えば /** @var \App\Models\User $this */ と書く。
    • 要は、 PHPDocs で API リソースクラスで使用するモデルを $this に紐づければ良いようだ。
  • その2
    • クラスコメントに、例えば /** @mixin \App\Models\User */ と書く。
    • 要は、 PHPDocs で API リソースクラスに使用するモデルを混ぜ込めば良いようだ。
カテゴリー
Linux

Laravel 8 での Vue.js 3 を使った SPA に Bootstrap Icons を導入するためのメモ

なぜメモったか

Bootstrap Icons · Bootstrap 向けのオープンソース SVG アイコンライブラリ のページを見ると、インストールと使い方は書いてあるものの、それだけでは足りず、調べなければうまく使うことができませんでした。

ですので、調べた内容を、走り書き程度ですが、メモいたします。

カテゴリー
Linux

Laravel 8 の Vue.js 3 の SPA に laravel/ui を使わないで Bootstrap 5 を導入するまでのメモ

まとめ

カテゴリー
Linux

Docker のホスト側に在る VS Code にて Docker コンテナ内の Xdebug と通信してステップ実行するための勉強と理解とポイントと設定

状況

  • Remote – Containers – Visual Studio Marketplace は使わない。
  • ホスト側にデバッグしたい PHP コードがあり、同じコードが Docker コンテナにもある状況。ボリューム共有はしていない。
  • 本当は Remote – Containers を使いたいが、古い Docker イメージでは使えない場合がある。そしてそのようなケースでは大抵 PHP も古く、 Xdebug も最新のバージョン 3 は使えず、バージョン 2 を使うことになる。この投稿では Xdebug 2 を取り扱う。
カテゴリー
Linux

Laravel 8 で Vue.js 3 を SPA として使えるようにした記録メモ

どの状態から始めたか?

Laravel 8 をインストールした直後に Vue.js 3 を SPA として最低限使えるようにしました。