Amazon Linux 2でSQLite3を最新バージョンにする

Amazon Linux 2でSQLite3のバージョンを上げるのに四苦八苦したのでメモ。

## Dockerコンテナ立ち上げ

Amazon Linuxのイメージを取得してコンテナを立ち上げます。

```sh
> docker pull amazonlinux
> docker -it amazonlinux
bash-4.2#
```

Amazon LinuxのイメージはすでにSQLite3がインストール済みですが、バージョンが`3.7.17` と少し古めです。`amazon-linux-extras` にもSQLite3はありません。

Amazon Linux 2 に関するよくある質問
https://aws.amazon.com/jp/amazon-linux-2/faqs/


SQLite3を最新バージョンに上げることができないかを確認します。

```sh:コンテナ内
bash-4.2# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668

bash-4.2# yum --version
3.4.3
  Installed: rpm-4.11.3-25.amzn2.0.3.x86_64 at 2019-02-07 20:40
  Built    : Amazon Linux at 2018-09-12 21:28
  Committed: Panu Matilainen <pmatilai@redhat.com> at 2017-03-17

  Installed: yum-3.4.3-158.amzn2.0.2.noarch at 2019-02-07 20:40
  Built    : Amazon Linux at 2018-08-21 16:27
  Committed: CentOS Sources <bugs@centos.org> at 2018-04-10
```

`yum` でSQLite3の詳細を確認しますが、バージョンは`3.7.17` のみのようです。

```sh
bash-4.2# yum list | grep sqlite
sqlite.x86_64                          3.7.17-8.amzn2.0.2             installed
apr-util-sqlite.x86_64                 1.6.1-5.amzn2.0.2              amzn2-core
freeradius-sqlite.x86_64               3.0.13-9.amzn2                 amzn2-core
golang-googlecode-sqlite-devel.x86_64  0-0.9.hg74691fb6f837.amzn2.0.2 amzn2-core
libdbi-dbd-sqlite.x86_64               0.8.3-16.amzn2.0.1             amzn2-core
sqlite.i686                            3.7.17-8.amzn2.0.2             amzn2-core
sqlite-devel.x86_64                    3.7.17-8.amzn2.0.2             amzn2-core
sqlite-doc.noarch                      3.7.17-8.amzn2.0.2             amzn2-core
sqlite-tcl.x86_64                      3.7.17-8.amzn2.0.2             amzn2-core

bash-4.2# yum info sqlite
Loaded plugins: ovl, priorities
Installed Packages
Name        : sqlite
Arch        : x86_64
Version     : 3.7.17
Release     : 8.amzn2.0.2
Size        : 795 k
Repo        : installed
(略)

bash-4.2# yum check-update
Loaded plugins: ovl, priorities

amazon-linux-extras.noarch                                 1.6.6-1.amzn2                                 amzn2-core

bash-4.2# find /usr/ -name sqlite3
/usr/lib64/python2.7/sqlite3
/usr/bin/sqlite3

bash-4.2# /usr/lib64/python2.7/sqlite3 --version
bash: /usr/lib64/python2.7/sqlite3: Is a directory

bash-4.2# /usr/bin/sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
```

試しに`yum remove sqlite` してみましたが、`Error: Trying to remove "yum", which is protected` となり削除できません。`yum` が依存しており削除できないように保護されてるようです。

```sh
bash-4.2# yum remove sqlite
Loaded plugins: ovl, priorities
Resolving Dependencies
--> Running transaction check
(略)
--> Finished Dependency Resolution
Error: Trying to remove "yum", which is protected
```

もし保護がされていないとして、SQLite3を削除すると`yum` が利用できなくなる罠があるみたいです。oh...

sqlite3を消すとyumが使えなくなる - maru.cc@はてな
http://marucc.hatenablog.com/entry/20080420/1208632521

centos で sqlite3 を削除すると yum が使えなくなる - 年寄りプログラマの備忘録
http://d.hatena.ne.jp/kawabes/20110921/1316577549


仕方ないので、公式から最新バージョンを取得して`make && make install` します。インストール方法は下記が参考になりました。

SQLite Installation
https://www.tutorialspoint.com/sqlite/sqlite_installation.htm

最新バージョンのファイルは下記から取得可能です。現在の最新バージョンは`3.27.1` でした。（2019/02/13時点）

SQLite Download Page
https://www.sqlite.org/download.html


```sh:コンテナ内
## ビルドするのに必要なパッケージをインストール
bash-4.2# yum install -y wget tar gzip gcc make

## ソースを取得
bash-4.2# wget https://www.sqlite.org/2019/sqlite-autoconf-3270100.tar.gz
bash-4.2# tar xvfz sqlite-autoconf-3270100.tar.gz

## ビルドしてインストール
bash-4.2# cd sqlite-autoconf-3270100

bash-4.2# ./configure --prefix=/usr/local

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... no
(略)
configure: creating ./config.status
config.status: creating Makefile
config.status: creating sqlite3.pc
config.status: executing depfiles commands
config.status: executing libtool commands


bash-4.2# make

source='sqlite3.c' object='sqlite3.lo' libtool=yes \
DEPDIR=.deps depmode=none /bin/sh ./depcomp \
/bin/sh ./libtool  --tag=CC   --mode=compile gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.27.1\" -DPACKAGE_STRING=\"sqlite\ 3.27.1\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.27.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -I.    -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE  -g -O2 -c -o sqlite3.lo sqlite3.c
(略)
libtool: link: gcc -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB -g -O2 -o sqlite3 sqlite3-shell.o sqlite3-sqlite3.o  -lm -ldl -lpthread


bash-4.2# make install

make[1]: Entering directory `/sqlite-autoconf-3270100'
 /usr/bin/mkdir -p '/usr/local/lib'
 (略)
 /usr/bin/mkdir -p '/usr/local/include'
 /usr/bin/install -c -m 644 sqlite3.h sqlite3ext.h '/usr/local/include'
 /usr/bin/mkdir -p '/usr/local/share/man/man1'
 /usr/bin/install -c -m 644 sqlite3.1 '/usr/local/share/man/man1'
 /usr/bin/mkdir -p '/usr/local/lib/pkgconfig'
 /usr/bin/install -c -m 644 sqlite3.pc '/usr/local/lib/pkgconfig'
make[1]: Leaving directory `/sqlite-autoconf-3270100'
```

インストールできたか確認します。

```sh:コンテナ内

bash-4.2# find /usr/ -name sqlite3
/usr/local/bin/sqlite3
/usr/lib64/python2.7/sqlite3
/usr/bin/sqlite3

bash-4.2# /usr/local/bin/sqlite3 --version
3.27.1 2019-02-08 13:17:39 0eca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd

bash-4.2# /usr/lib64/python2.7/sqlite3 --version
bash: /usr/lib64/python2.7/sqlite3: Is a directory

bash-4.2# /usr/bin/sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668

bash-4.2# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
```

`/usr/local/bin/sqlite3` にインストールされました。このままだと、元からインストールされていた方をみにいってしまうので、シンボリックリンクを貼ります。`yum remove` できないし、しゃーない。

```sh:コンテナ内
bash-4.2# mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
bash-4.2# ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3

bash-4.2# sqlite3 --version
3.27.1 2019-02-08 13:17:39 0eca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd

bash-4.2# yum update
Loaded plugins: ovl, priorities
amzn2-core                                                                                  | 2.4 kB  00:00:00
No packages marked for update
```

`yum` も動くし、まあいけるでしょう。


## `Dockerfile` でインストールする

コンテナ立ち上げるたびにインストールするのは手間なので、`Dockerfile` を利用してイメージ作成しておくと便利です。

```txt:Dockerfile
FROM amazonlinux:latest

RUN yum install -y wget tar gzip gcc make && \
    wget https://www.sqlite.org/2019/sqlite-autoconf-3270100.tar.gz && \
    tar xvfz sqlite-autoconf-3270100.tar.gz && \
    cd sqlite-autoconf-3270100 && \
    ./configure --prefix=/usr/local && \
    make && \
    make install && \
    mv /usr/bin/sqlite3 /usr/bin/sqlite3_old && \
    ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
```

## まとめ

`yum` でアップデートできたら簡単で良かったのですが、無事に最新バージョンに上げることができたので、良しとします。


## 参考

Amazon Linux 2 に関するよくある質問
https://aws.amazon.com/jp/amazon-linux-2/faqs/

sqlite3を消すとyumが使えなくなる - maru.cc@はてな
http://marucc.hatenablog.com/entry/20080420/1208632521

centos で sqlite3 を削除すると yum が使えなくなる - 年寄りプログラマの備忘録
http://d.hatena.ne.jp/kawabes/20110921/1316577549

SQLite Installation
https://www.tutorialspoint.com/sqlite/sqlite_installation.htm

SQLite Download Page
https://www.sqlite.org/download.html