ラズパイ4 busterにdockerインストール

ラズパイ4へのraspbian busterインストールは前記事（[ラズパイ4にraspbian busterをセットアップ](https://qiita.com/rootpia/items/4ec94793a7d77686fbef)）を参照。
環境を汚したくないのでdocker運用したい。…ということでインストールを行ったが、結構ハマった…。

# busterへのdockerインストールについて
raspbian buster用のdockerは正式にラズパイリポジトリに公開されていない。
おそらく将来的にはstrechと同じ手順でインストールできるようになると思うので、strechの手順も載せておく。
※現状はbusterでstrechの手順を実行してもエラーになるため注意。

## busterの場合
必要パッケージのインストール

```shell
$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common
```
debian用のリポジトリを追加する。

```shell
$ sudo bash -c "echo 'deb [arch=armhf] http://download.docker.com/linux/debian buster stable' > /etc/apt/sources.list.d/docker.list"
```
インストール

```shell
$ sudo apt update
$ sudo apt install --no-install-recommends docker-ce
```
--no-install-recommendsオプションを付けるのがミソ。
このオプションを付けないと、dockerと一緒にインストールされるaufs-dkmsのインストールが失敗する（なお、失敗してもそのままdockerは使用できる様子）。原因究明の試行錯誤は[トラブル対応の履歴](#トラブル対応の履歴)で後述する。

## strechの場合(1)
詳細は公式の[debian docker-ceインストール手順](https://docs.docker.com/install/linux/docker-ce/debian/)を参考にするとよい。

必要パッケージのインストール

```shell
$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common
```
GPGキー追加

```shell
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
```
インストール

```shell
$ sudo apt update
$ sudo apt install docker-ce
```

## strechの場合(2)
こっちのほうが楽。たぶん上述(1)と同じ処理だと思う（未確認）。

```shell
$ curl -sSL https://get.docker.com | sh`
```

# トラブル対応の履歴
以下はdocker-ceインストール時にハマった試行錯誤記。

`--no-install-recommends`を付けずにインストールすると、エラーが発生する。

```shell
$ sudo apt install docker-ce
　：
dpkg: パッケージ aufs-dkms の処理中にエラーが発生しました (--configure):
 installed aufs-dkms package post-installation script subprocess returned error exit status 10
cgroupfs-mount (1.4) を設定しています ...
docker-ce (5:19.03.5~3-0~debian-buster) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
systemd (241-7~deb10u2+rpi1) のトリガを処理しています ...
man-db (2.8.5-2) のトリガを処理しています ...
libc-bin (2.28-10+rpi1) のトリガを処理しています ...
処理中にエラーが発生しました:
 aufs-dkms
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

エラーログによると`installed aufs-dkms package post-installation script subprocess returned error exit status 10`とあるので、`post-installation script`の処理がエラーこいてるっぽい。

[dpkgやapt-get関連でエラーが出た時の対処法](https://qiita.com/yukari-n/items/d1b17bd37036f120153c)を参考にして、エラーステータスを確認する。

```shell
$ sudo dpkg --audit
以下のパッケージは最初の設定中に問題が発生したため、設定が終了していません。
dpkg --configure <パッケージ> か dselect で設定 (configure) メニューオプショ
ンを使って設定作業を再試行しなければなりません:
 aufs-dkms            DKMS files to build and install aufs
```
apt installのエラーログどおりだが、aufs-dkmsの設定がうまくいってないらしい。

* aufs-dkmsとは  
    [Debian 9 stretch では aufs をデフォルトで利用できない](https://blog.ymyzk.com/2016/12/aufs-unavailable-by-default-on-debian-9-stretch/)によると、union mountを実現するファイルシステムでdockerがサポートしているファイルシステムの1つらしい。overlayが利用可能になったのでaufsは不要になった…らしい。

aufs-dkmsって、いらない子なんじゃない？とも思うが、ひとまず設定ファイルを検索してみる。

```shell
$ sudo find / -name aufs-dkms*
/usr/share/doc/aufs-dkms
/var/cache/apt/archives/aufs-dkms_4.19+20190211-1_all.deb
/var/lib/dpkg/info/aufs-dkms.list
/var/lib/dpkg/info/aufs-dkms.postinst
/var/lib/dpkg/info/aufs-dkms.md5sums
/var/lib/dpkg/info/aufs-dkms.prerm
```

`post-installation script`に相当するのは、`/var/lib/dpkg/info/aufs-dkms.postinst`っぽいかな、とアタリをつけた。

[Debian ポリシーマニュアル：Chapter 6 - パッケージ管理スクリプトとインストールの手順](https://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/ch-maintainerscripts.html)によると「postinst は展開された後に呼び出されます」とのこと。

一度、再設定コマンドを実行してみたところ、kernelが原因っぽいことが見え隠れする…。

```shell
$ sudo dpkg --configure aufs-dkms
Building initial module for 4.19.75+
Error! Bad return status for module build on kernel: 4.19.75+ (armv7l)
Consult /var/lib/dkms/aufs/4.19+20190211/build/make.log for more information.
```

詳細ログ(`/var/lib/dkms/aufs/4.19+20190211/build/make.log`）を見てみると、read/writeでエラーになっている。
もしかして、新しいカーネルでは古い機能がサポートされなくなったか？？

```
　：
make[1]: ディレクトリ '/usr/src/linux-headers-4.19.75+' に入ります
  CC [M]  /var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/module.o
  CC [M]  /var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/sbinfo.o
  CC [M]  /var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/super.o
  CC [M]  /var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/branch.o
In file included from /var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/branch.h:33,
                 from /var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/aufs.h:38,
                 from /var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/sbinfo.c:23:
/var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/super.h:134:2: error: unknown type name ‘vfs_readf_t’
  vfs_readf_t  si_xread;
  ^~~~~~~~~~~
/var/lib/dkms/aufs/4.19+20190211/build/fs/aufs/super.h:135:2: error: unknown type name ‘vfs_writef_t’
  vfs_writef_t  si_xwrite;
　：
```
ググると同じ問題がissue：[Kernel missing support for aufs-dkms #3021](https://github.com/raspberrypi/linux/issues/3021)にも挙がっており、下記コメントがついている。
> i used to install docker ce 18.09.0 on Raspian Buster
> （意訳）docker-ce18.09なら使えるよ！
> > That does not work either.I am getting the same error:
> > （意訳）つかえねーよ。同じエラーでたぞ
> > > Added --no-install-recommends to my docker ce installation step.
> > > （意訳）--no-install-recommendsオプションを付けろ
> 
> aufs-dkms is not a dependency of docker-ce, but a recommendation.
> docker is not default to use aufs anymore; It now default prefer to use overlayfs2.
> （意訳）aufs-dkmsはdocker-ceに不要。デフォルトのファイルシステムはoverlay2だし。

現在のdocker versionを確認してみる。

```shell
$ docker -v
Docker version 19.03.5, build 633a0ea
```
バージョンは19.03。情報通りならバージョン指定するか、19.03でも--no-install-recommendsをつければいけるかも。


おや？インストール（post処理）が失敗してもdockerコマンドが動いてるな…。ちょっとrunを実行してみるか。

```shell
$ sudo docker run --rm hello-world

Hello from Docker!
　:
```
って、動いてるじゃん！？？？（マジかよ！）
インストールまではうまくいってて後処理（post）が失敗してるだけってことみたい。

一度、アンインストールして--no-install-recommendsで再インストールしてみる。

```shell
$ sudo apt purge docker-ce
　：
Error! Bad return status for module build on kernel: 4.19.75+ (armv7l)
Consult /var/lib/dkms/aufs/4.19+20190211/build/make.log for more information.
dpkg: パッケージ aufs-dkms の処理中にエラーが発生しました (--configure):
 installed aufs-dkms package post-installation script subprocess returned error exit status 10
処理中にエラーが発生しました:
 aufs-dkms
```
purgeするときにも同じエラーがでてきやがる。。。
しょうがないので、`aufs-dkms.postinst`という原因っぽいファイルをリネームしてpurge実行したらうまくいった。

```shell
$ sudo mv /var/lib/dpkg/info/aufs-dkms.postinst /var/lib/dpkg/info/aufs-dkms.postinst.bak
$ sudo apt purge docker-ce  # 成功
$ sudo apt autoremove
$ sudo rm /var/lib/dpkg/info/aufs-dkms.postinst.bak
```
あらためてインストール。

```shell
$ sudo apt install --no-install-recommends docker-ce
```
エラーなしで成功ッッッ！！！ついにきたか！


## aufs-dkmsのインストール（未実施）
前述のように--no-install-recommendsなしでdockerをインストールした場合、aufs-dkmsがインストールできない。
だがpurgeの挙動をみると、aufs-dkms.postinstファイルを削除してから、configureしなおせばインストールできると思われる。
削除してよいのかという疑問は残るけど。・・というか使えるんだから放置でもいいかもしれない。

```shell
# 未検証だけど、これでひとまずエラーは消える（はず）
sudo rm /var/lib/dpkg/info/aufs-dkms.postinst
sudo dpkg --configure aufs-dkms
```

# 動作確認
```shell
$ docker -v
Docker version 19.03.5, build 633a0ea
```
`docker run hello-world`, `docker images`など問題なく動く。
ただ、run実行後にコンテナ起動するまでが異常に遅い…。`起動に10秒くらい`かかる。うーん・・
ラズパイ3＋strech＋dockerの組合せでは遅くなる現象はなかったので、まだどこかおかしい様子。

でも、ひとまずインストールはできた。