Pukiwiki 用 Dockerコンテナを触ってみたメモ

※本記事は2023年初頭に書いた記事だったのですが、自分用メモに近いものだったので公開するかどうかを迷っていたのを忘れたまま1年経過していたことに今頃気づきました(2024年3月時点）遅くなりましたが、このまま捨てるのも忍びないのでひっそりと公開するものです。

# 今回の記事を3行で言うと
* 最近はたいていの環境で公式や有志提供の Dockerコンテナが用意されていて、環境構築を１からやらなくても良くなってきています
* DockerHubを探してみると、Pukiwiki にもDockerコンテナがあるようです
* どんなもんだかちょっと触ってみました

という、ほぼ自分のためだけの興味本位な記事となります。実は、去年[WSL上にPukiwikiを（コンテナなしで）構築する記事](https://qiita.com/smats-rd/items/89133224a5c0a2afb5b3)を書きましたが、そのときの作業の副産物で、コンテナありだとどうなるのか、も少し試していました。
なお、今回WSL上で作業していますが、WSLの使い方などの説明はしません。そちらについては別記事  [Windows上のWSLでコンテナによる開発環境を作ってみる（前準備編）](https://qiita.com/smats-rd/items/a28404d6443aad8c5278) に少し書いていますので興味のある方は参照いただければ幸いです。

# ちょっと昔は…
* Pukiwikiを使おうと思ったらPC上にApacheとPHP、もしくはXAMPP入れてどうのこうのとやっていましたが、最近はDockerという便利なものがあります。PukiwikiのDockerコンテナが提供されていれば面倒くさい環境構築はすっとばせます。
* コンテナはこちらで提供されていました→ [pengo/pukiwiki - Docker Image | Docker Hub](https://hub.docker.com/r/pengo/pukiwiki) 感謝です。
* Dockerfileなどはこちらにあるようです[^1] →[GitHub - pen/docker-pukiwiki: PukiWiki Unicode版のコンテナ化](https://github.com/pen/docker-pukiwiki)

[^1]:  今回は不要ですが、参考資料として記載しています。

# まずは初期表示まで
* さっそく docker run してみましょう。

``` : WSL
$ echo $HOME
/home/smatsu
$ mkdir $HOME\pukiwiki
$ docker run -p 8080:80 -v $HOME/pukiwiki:/ext -d pengo/pukiwiki
Unable to find image 'pengo/pukiwiki:latest' locally
latest: Pulling from pengo/pukiwiki
540db60ca938: Pull complete
490462e239fc: Pull complete
c71b743d9c28: Pull complete
99ddfc6996ec: Pull complete
Digest: sha256:3d55b800f725d334e628b1f8834d37a55db2d361ff11153ad7fd05b93b05907e
Status: Downloaded newer image for pengo/pukiwiki:latest
9eeed592292ff67a6e89c128b9c60fc4ec731a422235def8b96bdbc4f2eea0d7
$
```
* オプション -p はポートのマッピングです。PC上で8080に対するアクセスがコンテナ上でのポート80にフォワードされます。
* オプション -v の所でやっているのはマウントです。WSL上のディレクトリ  \\$HOME/pukiwiki をコンテナ内の /ext にマウントしています。今回の環境では$HOME=/home/smatsuです。これが何を意味するかというと、コンテナ内で /ext に置いてあるものはWSL上では /home/smatsu/pukiwiki を参照すれば見えるということです。
* オプションの -d はデタッチドモード（バックグラウンド実行）を指定しています。

* localhost:8080 をブラウザで指定。アッと言うまに表示できてしまいました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/ec155496-afb9-0d1a-e1a0-3dc91dd60cfa.png)
* 確かにコンテナが立ち上がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/44fc62f4-523b-6e93-3fa0-b845d6fd960d.png)
* frosty_cerf という名前でコンテナができています。
* 簡単すぎて拍子抜けです。早くできたのはいいとして、パスワードとかどうなってるのでしょう？

# コンテナ内を見てみる
* コンテナの中に入ってディレクトリを見てみます。bashを実行してみます。
``` : WSL
$ docker container exec -it frosty_cerf bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown
```
* -iは、Keep STDIN open even if not attached>標準入力を開き続ける。と言う意味
* -tは、Allocate a pseudo-TTY>疑似ttyを割りあてる。と言う意味
* startできないというエラーになりました。
* alpine linux にはbashが入ってないらしいです。では sh ならどうか。
``` : WSL
$ docker container exec -it frosty_cerf sh
/ # ls
bin    dev    etc    ext    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # exit
```
* shなら入れました。bash もインストールできるらしいので使ってみましょう。
``` : WSL
$ docker container exec -it frosty_cerf apk add bash
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/2) Installing readline (8.1.0-r0)
(2/2) Installing bash (5.1.16-r0)
Executing bash-5.1.16-r0.post-install
Executing busybox-1.32.1-r6.trigger
OK: 58 MiB in 33 packages
$ docker container exec -it frosty_cerf bash
bash-5.1#
```
* apk は Alpine 用のパッケージ管理コマンドです。add bash で bashをインストールします。
* OK、bashで入れたようです。ではコンテナ内でwikiはどこにあるのか。/var/www にあるようです。

``` : コンテナ内
bash-5.1# ls -l /var/www
total 64
lrwxrwxrwx    1 root     root            16 May 28  2021 attach -> /ext/data/attach
lrwxrwxrwx    1 root     root            16 May 28  2021 backup -> /ext/data/backup
lrwxrwxrwx    1 root     root            15 May 28  2021 cache -> /ext/data/cache
lrwxrwxrwx    1 root     root            17 May 28  2021 counter -> /ext/data/counter
lrwxrwxrwx    1 root     root            25 May 28  2021 default.ini.php -> /ext/conf/default.ini.php
lrwxrwxrwx    1 root     root            14 May 28  2021 diff -> /ext/data/diff
-rw-r--r--    1 root     root         17183 May 28  2021 en.lng.php
drwxr-sr-x    3 root     root          4096 May 28  2021 image
-rw-r--r--    1 root     root           177 Jan 12  2021 index.html
-rw-r--r--    1 root     root           708 May 28  2021 index.php
-rw-r--r--    1 root     root         20076 May 28  2021 ja.lng.php
lrwxrwxrwx    1 root     root            24 May 28  2021 keitai.ini.php -> /ext/conf/keitai.ini.php
drwxr-sr-x    2 root     root          4096 May 28  2021 lib
drwxr-sr-x    2 root     root          4096 May 28  2021 plugin
lrwxrwxrwx    1 root     root            26 May 28  2021 pukiwiki.ini.php -> /ext/conf/pukiwiki.ini.php
lrwxrwxrwx    1 root     root            23 May 28  2021 rules.ini.php -> /ext/conf/rules.ini.php
drwxr-sr-x    2 root     root          4096 May 28  2021 skin
lrwxrwxrwx    1 root     root            14 May 28  2021 wiki -> /ext/data/wiki
```
* なるほど。先ほどマウントした /ext に data や config があるのがわかると思います。
* Windowsのエクスプローラ上で /ext にマウントされている /home/smatsu/pukiwiki を見ると、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/06d46467-ddea-d399-92e6-6bd1341defc2.png)
* conf の下に pukiwiki.ini.php がありますので、開いてみましょう。パスワードに関する情報を探します。
``` php: pukiwiki.ini.php
/////////////////////////////////////////////////
// Admin password for this Wikisite

// Default: always fail
$adminpass = '{x-php-md5}!';

// Sample:
//$adminpass = 'pass'; // Cleartext
//$adminpass = '{x-php-md5}1a1dc91c907325c69271ddf0c944bc72'; // PHP md5()  'pass'
//$adminpass = '{x-php-sha256}d74ff0ee8da3b9806b18c877dbf29bbde50b5bd8e4dad7a3a725000feb82e8f1'; // PHP sha256  'pass'
//$adminpass = '{CRYPT}$1$AR.Gk94x$uCe8fUUGMfxAPH83psCZG/';   // LDAP CRYPT 'pass'
//$adminpass = '{MD5}Gh3JHJBzJcaScd3wyUS8cg==';               // LDAP MD5   'pass'
//$adminpass = '{SMD5}o7lTdtHFJDqxFOVX09C8QnlmYmZnd2Qx';      // LDAP SMD5  'pass'
//$adminpass = '{SHA256}10/w7o2juYBrGMh32/KbveULW9jk2tejpyUAD+uC6PE=' // LDAP SHA256 'pass'
```
adminpass は初期状態では使えないようになっているようです。

``` php: pukiwiki.ini.php
// User definition
$auth_users = array(
	// Username => password
	'foo'	=> 'foo_passwd', // Cleartext
	'bar'	=> '{x-php-md5}f53ae779077e987718cc285b14dfbe86', // PHP md5() 'bar_passwd'
	'hoge'	=> '{SMD5}OzJo/boHwM4q5R+g7LCOx2xGMkFKRVEx',      // LDAP SMD5 'hoge_passwd'
);
```
通常のid/パスワードは仮値として foo/foo_passwd, bar/bar_passwd, hoge/hoge_passwd が入っているようです。

# VSCodeからpukiwiki.iniを開いてみる。
* Windows上のVSCodeからpukiwiki.ini を開いてみます。
* まず、VSCodeの左下の緑色のメニューから「新しいWSLウィンドウ」を選択します。するとWSLに接続されます。
* 左側メニューから"WSLでフォルダーを開く…"を選択肢し、 pukiwikiのフォルダを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/595741d4-09e3-b138-6966-0ae6513ca4d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/36277f2b-da4a-a823-19e7-59499812143b.png)

* 開けました。pukiwiki.ini.php を開いてみた所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/3ef19351-02a1-67d0-cf1e-d801510e0834.png)

## VSCodeでWSL上のファイルの書き換えができない問題
* さっそく書き換えてみようとしたところ、下記のようなエラーになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/e01ee5bf-a39c-459b-56df-c29271c9b845.png)
* パーミッションを確認すると、こうなっています。root権限です。
``` :WSL
$ ls -l
合計 52
-rw-r--r-- 1 root root  7312  5月 28  2021 default.ini.php
-rw-r--r-- 1 root root 13915  5月 28  2021 keitai.ini.php
-rw-r--r-- 1 root root 21681  5月 28  2021 pukiwiki.ini.php
-rw-r--r-- 1 root root  1536  5月 28  2021 rules.ini.php
```
* VS Code は WSL のデフォルトログインユーザで動作しているため，所有者でないユーザの編集とみなされたようです．デフォルトユーザにオーナーを変更してみます。

```:WSL
$ echo $USER
smatsu
$ sudo chown smatsu pukiwiki.ini.php
[sudo] smatsu のパスワード:(ここには自分のパスワードを入れる）
$ ll
合計 60
drwxr-sr-x 2 root   root    4096  5月 28  2021 ./
drwxr-xr-x 4 smatsu smatsu  4096  7月 29 23:44 ../
-rw-r--r-- 1 root   root    7312  5月 28  2021 default.ini.php
-rw-r--r-- 1 root   root   13915  5月 28  2021 keitai.ini.php
-rw-r--r-- 1 smatsu root   21681  5月 28  2021 pukiwiki.ini.php
-rw-r--r-- 1 root   root    1536  5月 28  2021 rules.ini.php
```
* こうすると、VSCodeでの書き換えが可能となりました。

# 実際にPukiwikiを編集してみたところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/6884196d-6be5-713d-8ec3-9890044b5b8b.png)

# まとめ
とりあえず、やってみようと思ったことはできたのでここまでの結果をまとめます。
* Pukiwikiの構築が面倒なら、DockerHubに Alpine Linuxで構築したDockerイメージが登録されているのでそれをDocker Runしてきて使うという手がある。
* ~~しかし、WSL上のフォルダがマウントされていたりといったカスタマイズが加えられているので、逆にちょっと使いづらい。普通にプレーンな設定で作って欲しかった…~~（※2024.4.1追記：作者の方よりコメントにてvオプションを省略すればマウントしないということを教えていただきました。ありがとうございます）。
* ということで、やっぱり自分の希望に合わせるにはコンテナから自分で作った方が良さそうです。

今回は以上です。どなたかの参考になれば幸いです。