WPP
podman で Caddy + CakePHP5 を動かす

前回の続きです。php-fpm コンテナに CakePHP5 をインストールできたのでいよいよ CaddyServer を入れます。

目的の構成

一旦、今回 podman で建てようとしているコンテナとポートの構成を説明しておきます。

  • CaddyServer ホストポート:8080 > コンテナポート:80
  • php-fpm ホストポート: – > コンテナポート:9000
  • MariaDB ホストポート:3306 > コンテナポート:3306
  • ./html フォルダを作り CaddyServer と php-fpm からそれぞれリンクする

手順

Caddy コンテナ

Caddyfile を作成します。 / で CakePHP をホストする場合はシンプルです。

$ mkdir conf
$ vi conf/Caddyfile
:80 {
	# Set this path to your site's directory.
	root * /usr/share/caddy/app/webroot
	encode gzip

	# Enable the static file server.
	file_server

	# Another common task is to set up a reverse proxy:
	php_fastcgi localhost:9000

	# log
}

最初 /app などのサブディレクトリでホストしようとしましたが、参考リンクによるとサブディレクトリでホストするのは難しいらしいのでそうそうにあきらめました。

$ podman run --name caddy -p 8080:80/tcp \
  -v ./conf/Caddyfile:/etc/caddy/Caddyfile \
  -v ./html:/usr/share/caddy \
  caddy:latest

ここまでで MariaDB、Caddy、php−fpm の3つのコンテナが揃いました。podman 的には kubernetes の yaml ファイルにしろってことなので簡単に生成するために、podman-desktop で pod を作ります。

そのまま pod を yaml に吐き出したものを少し修正します。修正した結果はこんな感じです。

# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.4.4
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-04-29T05:49:28Z"
  labels:
    app: caddy-pod
  name: caddy-pod
spec:
  containers:
  - args:
    - mariadbd
    image: docker.io/library/mariadb:11.3
    name: maria
    ports:
    - containerPort: 3306
      hostPort: 3306
    - containerPort: 80
      hostPort: 8080
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: maria-data
  - image: docker.io/library/caddy:latest
    name: caddy
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
    volumeMounts:
    - mountPath: /etc/caddy/Caddyfile
      name: caddy-file
    - mountPath: /usr/share/caddy
      name: html-caddy
  - args:
    - php-fpm
    image: localhost/my-php:latest
    name: php
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
    volumeMounts:
    - mountPath: /usr/share/caddy
      name: html-fpm
    - mountPath: /usr/local/etc/php/php-fpm.conf
      name: fpm-conf
    - mountPath: /usr/local/etc/php/php.ini
      name: php-ini
  restartPolicy: Never
  volumes:
  - hostPath:
      path: /opt/ws/podman-caddy/maria/data
      type: Directory
    name: maria-data
  - hostPath:
      path: /opt/ws/podman-caddy/conf/Caddyfile
      type: File
    name: caddy-file
  - hostPath:
      path: /opt/ws/podman-caddy/html
      type: Directory
    name: html-caddy
  - hostPath:
      path: /opt/ws/podman-caddy/html
      type: Directory
    name: html-fpm
  - hostPath:
      path: /opt/ws/podman-caddy/php-fpm/php/php-fpm.conf
      type: File
    name: fpm-conf
  - hostPath:
      path: /opt/ws/podman-caddy/php-fpm/php/php.ini-development
      type: File
    name: php-ini
status: {}

この yaml ファイルで pod を起動してみます。

$ podman play kube caddy-pod.yaml

localhost:8080 にブラウザアクセスしてみます。

MariaDB との接続がまだできていませんが、動作するところまで到達しました。

参考

The “subfolder problem”, OR, “why can’t I reverse proxy my app into a subfolder?” – Wiki – Caddy Community

podman で cakephp5を動かす

だいぶ佳境に入ってきましたが podman で cakephp5 を動かす続きです。php-fpm コンテナを作り、CakePHP5 をインストールします。CaddyServer は長くなるので次の記事にします。

目的の構成

一旦、今回 podman で建てようとしているコンテナとポートの構成を説明しておきます。

  • CaddyServer ホストポート:8080 > コンテナポート:80
  • php-fpm ホストポート:- > コンテナポート:9000
  • MariaDB ホストポート:3306 > コンテナポート:3306
  • ./html フォルダを作り CaddyServer と php-fpm からそれぞれリンクする

本来なら MariaDB のポートは、php-fpm からしかアクセスしないのでホスト側に露出しなくて良いのですが、ホスト側から触れたほうが便利なので便宜上開けてます。インターネット上のサーバに建てる際は開けないほうがいいでしょう。

Caddy と php-fpm コンテナは分けなくてもいいのかもしれませんが今回は分けています。

php-fpm の設定はちょっと面倒なのでちゃんと手順を追って示していきます。

手順

php-fpm コンテナ

php-fpm イメージのビルド

php のコンテナはイメージ持ってくるだけでは済まないので Dockerfile をつくります。

FROM php:8.3-fpm-bookworm
LABEL MAINTAINER="mnishi"
ARG UID=1000
ARG GID=1000

RUN apt-get update && \
    apt-get install -y git zip unzip vim libonig-dev libxml2-dev wget && \
    docker-php-ext-install intl pdo_mysql bcmath mbstring simplexml
RUN wget https://getcomposer.org/installer -O composer-installer.php && \
    php composer-installer.php --filename=composer --install-dir=/usr/local/bin && \
    composer self-update

RUN usermod  -u $UID www-data && \
    groupmod -g $GID www-data

WORKDIR /var/www

イメージは、Debian の方がまだ慣れているので 8.3-fpm-bookworm としました。

apt-get で必要なモジュールをインストールしてますが、vim は完全な好みなので入れなくていいです。wget も不要かもしれません。

docker-php-ext-install で CakePHP に必要なモジュールをインストールします。

/usr/local/bin に composer をインストールします。

ARG UID= とARG GID= は、ホスト側の実行ユーザーの uid、gid を渡すための環境変数です。もしかすると初期値はいらないかもしれません。

php-fpm コンテナの起動

ビルドする前に www-data ユーザをホストに作っておき、ログインユーザーのグループにも追加しておきます。

$ useradd -M www-data
$ usermod -aG www-data [ログインユーザー]

ビルドします。Dockerfile と同じフォルダで以下のコマンドを実行します。

$ buildah bud --build-arg UID=$(id -u www-data) --build-arg GID=$(id -g www-data) --tag my-php . 

一旦コンテナを起動して、設定ファイルを php-fpm フォルダに取り出します。(フォルダ名はなんでもいいです。)

$ mkdir php-fpm
$ podman run --name tmp-php -d localhost/my-php
$ podman cp tmp-php:/usr/local/etc/php/php.ini-production ./php-fpm
$ podman cp tmp-php:/usr/local/etc/php/php.ini-development ./php-fpm
$ podman cp tmp-php:/usr/local/etc/php/php-fpm.conf ./php-fpm
$ podman rm -f tmp-php

使わないかも(設定を変更しないかも)しれませんが、一応 php.ini と php-fpm.conf を取ってきます。

取ってきた設定ファイルを使用してコンテナを起動します。

podman run -d --name php \
    -v ./php-fpm/php/php-fpm.conf:/usr/local/etc/php/php-fpm.conf \
    -v ./php-fpm/php/php.ini-development:/usr/local/etc/php/php.ini \
    -v ./html:/usr/share/caddy \
    my-php

起動に失敗するようでしたら、-d を外してエラーを眺めてください。

php-fpm コンテナ内で CakePHP のインストール

ここまで全てがうまく行っていれば、コンテナの中に入って composer で CakePHP をデプロイできるはずです。

; ホスト側から
$ podman exec -it caddy-pod-php /bin/bash 

 ; コンテナの中に入った
# cd /usr/share/caddy
# composer create-project --prefer-dist cakephp/app:"5.*" app
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? yes
; root  で動かしているよと怒られるが無視する

.... いろいろログが流れる

Set Folder Permissions ? (Default to Y) [Y,n]? y
Permissions set on /usr/share/caddy/app/tmp/cache
Permissions set on /usr/share/caddy/app/tmp/cache/models
Permissions set on /usr/share/caddy/app/tmp/cache/persistent
Permissions set on /usr/share/caddy/app/tmp/cache/views
Permissions set on /usr/share/caddy/app/tmp/sessions
Permissions set on /usr/share/caddy/app/tmp/tests
Permissions set on /usr/share/caddy/app/tmp
Permissions set on /usr/share/caddy/app/logs
Updated Security.salt value in config/app_local.php

流行りのルートレス構成ではないので、怒られますがひとまずそのまま行きます。(慣れた所でもう一度ルートレス構成をやってみてもいいかもしれない。)

CakePHP のインストールで php モジュールが不足してエラーが出た場合は、exec でコンテナ内に入り docker-php-ext-install で不足モジュールをインストールして composer が動作するか確認します。
うまく行ったら、Docker ファイルに不足モジュールを追加しします。その後、イメージのビルドからやり直します。

参考

podman で nginx + php + mariadb を立ち上げてみる | zu-min.com

podman で MariaDB を動かす

さて、先日から格闘している podman の続きです。cakephp5 を動かす pod を作成すべく作業をしているわけですが、本日は MariaDB 編です。

MariaDB を動かすには root ユーザーのパスワードやらを渡す必要があるのですが、ネットを検索するとコマンドラインで -e で環境変数を指定するスタイルが多く見つかります。個人的に長過ぎるコマンドラインは好きではないので (読み取るのも打つのも大変なので) 環境変数は別ファイルで逃がす形にします。

MARIADB_ROOT_PASSWORD=caddy-cake-PASSWORD
MARIADB_DATABASE=cake
MARIADB_USER=cake
MARIADB_PASSWORD=cake-user-PASSWORD
TZ='Asia/Tokyo'

なんとなく見てわかるとおりと思うので実際のパスワードやなんかはお好みで変えてください。

起動するには、env ファイルのあるディレクトリで以下のようにします。(前提条件として docker Hub registry のセットアップは終わっているものとします。)

podman run -d --name maria \
	--env-file ./env \
	-v ./maria/data:/var/lib/mysql \
	-p 3306:3306/tcp \
	--userns keep-id \
	mariadb:11.3 

MariaDB のデータはホスト側のファイルシステムに直接リンクしてます。その際 –userns keep-id がないとコンテナ内に割り当てられた uid (100239 とか大きな値になる)がファイルオーナーになるので嬉しくないです。

–userns keep-id をつけると ./maria/data が自分の所有になるのでいい感じです。

まだ不慣れなのもあるのですが、どうも docker-desktop と異なり podman-desktop は cli で指定できるオプションがだいぶ削られているような気がします。(お前がわかっていないだけという可能性も否定できないですが。。。)

しばらく続きます。

podman run -d –name maria \
–env-file ./env \
-v ./maria/data:/var/lib/mysql \
-p 3306:3306/tcp \
–userns keep-id \
mariadb:11.3

wordpress のパーマリンク設定を基本に変更

今回は、WP のパーリンク設定についての備忘録です。

今のwordpress サイトは数ヶ月前にさらから設定したものですが、パーマリンクに [投稿名] が入っていました。先日ふと気になって WP Statistics のページ眺めてると、リンクを辿れないページがあることに気づきました。

辿れないページは [投稿名] の後ろに %e04feo みたいな読めない文字列が連なっていました (% 以降は雰囲気です)。恐らくですが、日本語処理がどこかでミスっているっぽいらしい。

具体的な不具合の箇所はPHP の設定なのか、wordpress の設定かわかりませんが追求するのが面倒なので [基本] に戻すことにしました。

設定箇所は以下です。

admin ログイン > 設定 > パーマリンク > 基本

検索エンジンにインデックスされていたページがすべて死んだので、しばらくどこからも検索されないだろう。

Linux Mint カレンダーで CalDAV/CardDAV を扱うには Evolution を入れる

さてカレンダーアプリは Synology NAS のカレンダーをメインで使っているのですが、Linux Mint をメインで使うようになってちょっと困っていたのがカレンダーの管理です。

Linux Mint には gnome カレンダーがついているっぽいのですが、そこで CalDAV アカウントを追加する方法がありませんでした。そのため避難先として Vivaldi ブラウザのカレンダ機能を使っていました。

Vivaldi も決して悪くはないのですがブラウジング中に予定を見たいときに、見ているタブが隠れてしまうのと、操作性と画面のウルサイ感じが地味にストレスでした。

とはいえ メールは完全に Web ベースしか使っていないので Evolution 使うのはちょっと大げさだとかんじていましたが、Chienomi さんのページをみると
「 Evolution 入れて CalDAV カレンダーを追加すると gnome カレンダーから参照できるようになる。」
なんですと ?!。ということでやってみました。

Evolution を起動し、カレンダーを追加した後、gnome カレンダーを起動するとあっさりとカレンダーのアイテムが表示されるようになりました。

CardDAVアドレス帳も同じように、Evolution で追加してやると gnome Contats (日本語表示していないのでわからないのですが、恐らくアドレス帳じゃないかと思う) で CardDAV の参照ができるようになった。

1 つ課題が解決しました。

参照

Linux環境でCalDavを使ったカレンダー利用 – Chienomi

Using a CalDAV calendar

Joplin でタグなしのノートを検索したい時

以前は NAS の Synology Note を使っていたのですがいつからか Joplin というノートアプリに移行しました。Synology Note が遅くなってきたのが理由だと思いましたがちょっと定かではないです。

で、ちょうど少しノートの整理をしてた時、タグなしのノートを見つけたかったので調べました。

検索窓に `-tag:*’ と入力すると OK でした。

参考リンクに他の検索項目の見つけ方があったので貼ってあります。

関係ないですが、Outlook のメール検索の場合は label を検索する時は、categories: だったような気がしますが、このあたりツールごとに少しずつ意味するものと名前が違うのでいつも混乱というか都度調べるのが面倒です。早いとこ Copilot のような AI エージェントがチャットで適当に条件指定するといい感じで検索してくれるようにな世界になってほしいものです。

参考

Searching | Joplin

podman / docker 内の Caddy admin API にアクセスする方法

ひきつづき podman 関連のネタです。 podman に CakePHP5 環境を作っている途中ですが、 せっかくなので今回はnginx ではなく Caddy Server を使おうと思い試行錯誤しています。

Caddy は /config/ にアクセスすると設定を取得/変更することができるエンドポイントがありますが、その性質上 localhost (127.0.0.1) からしかアクセスできないようにデフォルトで設定されています。

で今回は、docker でも podman でもコンテナ内で Caddy を動かすとホスト側のブラウザからのアクセスは、コンテナにとっては外部からのアクセスになるのでアクセスできません。(コンテナ使うとよく出会うあの現象です。)

ここにさらっと localhost からのアクセスに制限されているとありますが、どうやったら設定を変更できるかは正直言って見つけにくいです。

わかってしまえば Caddyfile のGlobal block に設定を入れれることがわかるのですが、わからなかったので記事にします。

# global block
# ようは一番上に {} のブロックを入れると global ブロックになるようだ。
{
  admin 0.0.0.0:2019
}
:80 {
  # 80 で待ち受ける内容が以下につづく。
  ....
}

これで curl localhost:2019/config/ でアクセスできるようになりました。

参考

How to execute the Caddy API in Docker? – Help – Caddy Community

Global options (Caddyfile) — Caddy Documentation

podman の補完を設定する

ぼちぼち、podman をいじり始めているわけですがどうも completion が効いていない気がします。 docker (podman も同じように) はコマンドが長いので補完なしでは厳しすぎるので調べてみます。

podman 3.4.4 では –help としても completion のことはまったく出てきませんが、気にせずヘルプを表示してみます。どうやら、bazh、zsh、fish を powershell 用の補完設定ができるようです。

今回は bash で設定します。

$ podman completion --help 
Generate shell autocompletions

Description:
  Generate shell autocompletions.
  Valid arguments are bash, zsh, and fish.
  Please refer to the man page to see how you can load these completions.

Usage:
  podman completion [options] {bash|zsh|fish|powershell}

Examples:
  podman completion bash
  podman completion zsh -f _podman
  podman completion fish --no-desc

Options:
  -f, --file string   Output the completion to file rather than stdout.
      --no-desc       Don't include descriptions in the completion output.

$ sudo  podman completion bash >> /etc/bash_completion.d/podman
$ source /etc/bash_completion.d/podman

これで、補完が効くようになりました。

早いとこコンテナを pod に押し込んで yaml を吐き出して docker compose の代わりに動かしたいのですがなかなかそこまでたどり着きませんね。。。しばらく続きます。

参考

Debian 11 bullseyeでpodmanとdocker-composeを使ってみた | Days of speed

podman search で検索できるようにする(レジストリの設定)

CakePHP5 へのマイグレーションついでに docker compose から podman への移行もテストすることにした。

おもむろにインターネットを検索すると多数のページがヒットするが、大抵はハローワールド的に httpd (apache) を動作させているか、cli のコマンドが docker とどれだけ似ているかを確かめるページにぶちあたる。

そういうのはいいんだよ、公式をなぞっているだけでしょ?と文句をいいつつ、むしろ Docker hub からさくっと取ってきてスグに環境作れるってのがどうなるのよ?ってのを知りたいわけだ。

なので、レジストリから検索して pull できるようになるとこまでを晒します。

環境

  • Linux Mint 21.3
  • podman をインストールすると現在 (2024/4/20) バージョン 3.4.4 がインストールされる。

手順

上記のパターンなのかおま環なのかわかりませんが、 registry が設定されていません。なので、 podman search としても虚しく改行されるだけで終わります。
そこで 3.2. コンテナーレジストリーの設定 Red Hat Enterprise Linux 8 | Red Hat Customer Portal に従いレジストリの設定をしていきます。

$ podman info |less 
;; regisries の search が空に設定されていました。

$ touch ~/.config/containers/registries.conf
$ vi ~/.config/containers/registries.conf
unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]
short-name-mode = "permissive"
:wq

registries となっているとので redhat のもの 2 つ と docker.io を設定したようだ。

nginx を検索するとちゃんと見つかりました。(registry.redhat.io と docker.io で見つかった模様)

$ podman search nginx
INDEX       NAME                                                       DESCRIPTION                                      STARS       OFFICIAL    AUTOMATED
docker.io   docker.io/library/nginx                                    Official build of Nginx.                         19768       [OK]        
docker.io   docker.io/library/unit                                     Official build of NGINX Unit: Universal Web ...  26          [OK]        
docker.io   docker.io/nginx/nginx-ingress                              NGINX and  NGINX Plus Ingress Controllers fo...  89                      
docker.io   docker.io/nginxinc/nginx-unprivileged                      Unprivileged NGINX Dockerfiles                   144                     
docker.io   docker.io/nginx/nginx-prometheus-exporter                  NGINX Prometheus Exporter for NGINX and NGIN...  40                      
docker.io   docker.io/nginxinc/nginx-s3-gateway                        Authenticating and caching gateway based on ...  6                       
docker.io   docker.io/nginx/unit                                       This repository is retired, use the Docker o...  64                      
docker.io   docker.io/nginx/nginx-ingress-operator                     NGINX Ingress Operator for NGINX and NGINX P...  2                       
docker.io   docker.io/nginxinc/amplify-agent                           NGINX Amplify Agent docker repository            1                       
docker.io   docker.io/nginx/nginx-quic-qns                             NGINX QUIC interop                               1                       
docker.io   docker.io/nginxinc/ingress-demo                            Ingress Demo                                     4                       
docker.io   docker.io/nginxproxy/nginx-proxy                           Automated nginx proxy for Docker containers ...  132                     
docker.io   docker.io/nginxproxy/acme-companion                        Automated ACME SSL certificate generation fo...  130                     
docker.io   docker.io/bitnami/nginx                                    Bitnami container image for NGINX                186                     [OK]
docker.io   docker.io/bitnami/nginx-ingress-controller                 Bitnami container image for NGINX Ingress Co...  32                      [OK]
docker.io   docker.io/nginxproxy/docker-gen                            Generate files from docker container meta-da...  16                      
docker.io   docker.io/bitnami/nginx-exporter                           Bitnami container image for NGINX Exporter       5                       
docker.io   docker.io/nginxinc/mra-fakes3                                                                               0                       
docker.io   docker.io/ubuntu/nginx                                     Nginx, a high-performance reverse proxy & we...  112                     
docker.io   docker.io/nginxinc/mra_python_base                                                                          0                       
docker.io   docker.io/nginxinc/ngx-rust-tool                                                                            0                       
docker.io   docker.io/rancher/nginx-ingress-controller                                                                  13                      
docker.io   docker.io/kasmweb/nginx                                    An Nginx image based off nginx:alpine and in...  7                       
docker.io   docker.io/rancher/nginx-ingress-controller-defaultbackend                                                   2                       
redhat.io   registry.redhat.io/rhel8/nginx-114                         Nginx is a web server and a reverse proxy se...  0                       
redhat.io   registry.redhat.io/rhel8/nginx-118                         Platform for running nginx 1.18 or building ...  0                       
redhat.io   registry.redhat.io/ubi8/nginx-120                          Platform for running nginx 1.20 or building ...  0                       
redhat.io   registry.redhat.io/rhel9/nginx-120                         rhcc_registry.access.redhat.com_rhel9/nginx-...  0                       
redhat.io   registry.redhat.io/rhel8/nginx-122                         rhcc_registry.access.redhat.com_rhel8/nginx-...  0                       
redhat.io   registry.redhat.io/rhel8/nginx-116                         Platform for running nginx 1.16 or building ...  0                       
redhat.io   registry.redhat.io/ubi8/nginx-118                          Platform for running nginx 1.18 or building ...  0                       
redhat.io   registry.redhat.io/rhel8/nginx-120                         Platform for running nginx 1.20 or building ...  0                       
redhat.io   registry.redhat.io/ubi9/nginx-120                          rhcc_registry.access.redhat.com_ubi9/nginx-1...  0                       
redhat.io   registry.redhat.io/ubi8/nginx-122                          rhcc_registry.access.redhat.com_ubi8/nginx-1...  0                       
redhat.io   registry.redhat.io/rhel9/nginx-122                         rhcc_registry.access.redhat.com_rhel9/nginx-...  0                       
redhat.io   registry.redhat.io/ubi9/nginx-122                          rhcc_registry.access.redhat.com_ubi9/nginx-1...  0                       
redhat.io   registry.redhat.io/rhscl/nginx-18-rhel7                    Nginx 1.8 server and a reverse proxy server      0                       
redhat.io   registry.redhat.io/rhscl/nginx-112-rhel7                   Nginx is a web server and a reverse proxy se...  0                       
redhat.io   registry.redhat.io/rhscl/nginx-110-rhel7                   Nginx container image that delivers an nginx...  0                       
redhat.io   registry.redhat.io/rhscl/nginx-16-rhel7                    Nginx 1.6 server and a reverse proxy server      0                       
redhat.io   registry.redhat.io/rhscl/nginx-114-rhel7                   Nginx is a web server and a reverse proxy se...  0                       
redhat.io   registry.redhat.io/rhscl/nginx-116-rhel7                   Platform for running nginx 1.16 or building ...  0                       
redhat.io   registry.redhat.io/rhscl/nginx-118-rhel7                   Platform for running nginx 1.18 or building ...  0                       
redhat.io   registry.redhat.io/ubi7/nginx-118                          Platform for running nginx 1.18 or building ...  0                       
redhat.io   registry.redhat.io/rhscl/nginx-120-rhel7                   Platform for running nginx 1.20 or building ...  0                       
redhat.io   registry.redhat.io/ubi7/nginx-120                          Platform for running nginx 1.20 or building ...  0                       
redhat.io   registry.redhat.io/3scale-amp23/apicast-gateway             3scale's API gateway (APIcast) is an OpenRe...  0                       
redhat.io   registry.redhat.io/3scale-amp20/apicast-gateway            3scale's API gateway (APIcast) is an OpenRes...  0                       
redhat.io   registry.redhat.io/rhamp10/apicast-gateway                 3scale's API gateway (APIcast) is an OpenRes...  0  

$ podman pull nginx
Resolved "nginx" as an alias (/home/mnishi/.cache/containers/short-name-aliases.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob b9d060e68bbc done  
Copying blob 4a666f159bd0 done  
Copying blob c028eb95b065 done  
Copying blob e74ab6743f66 done  
Copying blob c46d32988911 done  
Copying blob 13808c22b207 done  
Copying blob 297a65ba6f04 done  
Copying config 2ac752d7ae done  
Writing manifest to image destination
Storing signatures
2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580

pull する時、初回はどのレジストリを使うか選択肢が表示されるが 2 回目は表示されないのでどこかで記憶されているようだ。今回は docker.io を選んだが変えたくなったときにまた調べないといけなそうだ。(キャッシュを消せば OK か ?)

下記の「日記というほどでも」をみると検索の仕方も色々あって公式のみに絞るとかは自分的にはよく使うことになりそう。

追記

github の ghcr.io を追加するには、同様に unqualified-search-registries に “ghcr.io” を追加すれば良いようだ。ただし検索速度がものすごく遅くなるのでやらない方がいいかもしれない。

参考

3.2. コンテナーレジストリーの設定 Red Hat Enterprise Linux 8 | Red Hat Customer Portal

Podmanコマンドで本気でコンテナイメージを探すには | 日記というほどでも

CakePHP5 の日本語チュートリアルでハマったら英語版を見よう!

追記: プルリクが取り込まれたのでこのページの内容は本家見れば OK になりました。

引続き、CakePHP5 のチュートリアルを進行してますが、どうもコードサンプルが古いバージョンのもののようです。そのため、少しハマりました。まあ、英語版見ろよと。。。

具体的には CMS チュートリアル – Articles コントローラーの作成 – 5.x の ArticleController の paginator 部分でエラーが発生します。

英語版 を見てみるとコードが違っていました。こんな感じです。

<?php
// src/Controller/ArticlesController.php

namespace App\Controller;

class ArticlesController extends AppController
{
    public function index()
    {
        $articles = $this->paginate($this->Articles);
        $this->set(compact('articles'));
    }
}

paginate はコンポーネントではなくてそもそも組み込まれているようです。日本語版のドキュメントにプルリクだしましたが、英語力が怪しすぎるので蹴られるかもしれません。

わりとちゃんと翻訳されてそうな雰囲気だったので盲信してチュートリアル進めてきたのですが、思わぬ落とし穴に突き当たりました。せめてチュートリアルページだけでもちゃんと整備しておかないとますます CakePHP の不人気に拍車がかかりそうだなと感じた一幕でした。