Amazon Linux2にLinuxbrewをいれて環境構築してみる

![linux-1962898_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/e844dfa6-4094-e601-6ecb-a3dc0b7d0a3c.jpeg)

## はじめに

皆さん、どうもです。[ｋ．ｓ．ロジャース](https://www.wantedly.com/companies/ks-rogers)のやすもんです。
今回は、今までcurlとかbuildとかで頑張って構築していたDockerのwebアプリケーションコンテナをLinuxbrewを使ってやろうと思います！
弊社ではPHPのフレームワークにphalconを採用しているのですが、現状ソースからのbuildなのでこれらをbrewで入れれると楽だなーという感じです
では、早速いってみましょう！

## 前提
dockerなどの環境構築は完了している想定です！

## amzn2イメージの取得
```shell
$ docker pull amazonlinux:2
```

## Linuxbrewを入れる
amzn2のコンテナを起動し、環境構築開始です！

```shell
$ docker run -it --name test amazonlinux:2 /bin/bash
```
以降はコンテナ内の作業です

Linuxbrewを入れる準備([公式のコマンド](https://docs.brew.sh/Homebrew-on-Linux))

```shell
$ yum groupinstall -y 'Development Tools' && yum install -y curl file git curl-devel
```

amzn2イメージは軽量構成なので、各種神器たちを入れていきます

```shell
$ yum -y install gcc make autoconf sudo diffutils vi wget tar which
```

brewはrootだと入らないので、ユーザを作成します

```shell
$ adduser brew 
$ echo 'brew:hoge' |chpasswd
$ usermod -G wheel brew
$ su - brew
```

Linuxbrewをインストール

```shell
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```

途中でパスワードを求められたら入力します
warning吐いて終了しますが、一旦OK

PATH周り設定

```shell
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
```

brew doctorしてみる

```shell
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: The following directories do not exist:
/home/linuxbrew/.linuxbrew/var/homebrew/linked

You should create these directories and change their ownership to your account.
  sudo mkdir -p /home/linuxbrew/.linuxbrew/var/homebrew/linked
  sudo chown -R $(whoami) /home/linuxbrew/.linuxbrew/var/homebrew/linked
```
ディレクトリ作ってchownしろと言われるので仰せのままに

```shell
$ sudo mkdir -p /home/linuxbrew/.linuxbrew/var/homebrew/linked
$ sudo chown -R brew /home/linuxbrew/.linuxbrew/var/homebrew/linked
```

再度brew doctorしてみる

```shell
$ brew doctor
Your system is ready to brew.
```
よさそうだ

## PHPの環境を構築
PHP7.2とPhalcon3.4.2の環境を作っていきます

php7.2のインストール
まぁ`amazon-linux-extras`で入れれるのでこれはそこまでありがたみがないですが。。。

```shell
$ brew install php72

$ echo 'export PATH="/home/linuxbrew/.linuxbrew/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/home/linuxbrew/.linuxbrew/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile

$ exit
$ su - brew

$ php -v
PHP 7.2.17 (cli) (built: Apr 12 2019 06:04:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.17, Copyright (c) 1999-2018, by Zend Technologies

$ which php
/home/linuxbrew/.linuxbrew/opt/php@7.2/bin/php
```

よさそうだ
続いて、phalconをインストールしていく([公式のコマンド](https://docs.phalconphp.com/3.4/en/installation))

```shell
$ brew tap tigerstrikemedia/homebrew-phalconphp
$ brew install php72-phalcon
```
php.iniにphalcon.soのpathを通す

```shell
$ vi /home/linuxbrew/.linuxbrew/etc/php/7.2/php.ini

(最下部に以下を追加)
extension=/home/linuxbrew/.linuxbrew/Cellar/php72-phalcon/3.4.2/phalcon.so
```

確認

```shell
$ php -i "(command-line 'phpinfo()')" | grep phalcon
phalcon
phalcon => enabled
phalcon.db.escape_identifiers => On => On
phalcon.db.force_casting => Off => Off
phalcon.orm.cast_on_hydrate => Off => Off
phalcon.orm.column_renaming => On => On
phalcon.orm.disable_assign_setters => Off => Off
phalcon.orm.enable_implicit_joins => On => On
phalcon.orm.enable_literals => On => On
phalcon.orm.events => On => On
phalcon.orm.exception_on_failed_save => Off => Off
phalcon.orm.ignore_unknown_columns => Off => Off
phalcon.orm.late_state_binding => Off => Off
phalcon.orm.not_null_validations => On => On
phalcon.orm.update_snapshot_on_save => On => On
phalcon.orm.virtual_foreign_keys => On => On
```

うむ、うまく動いてそうだ

```shell
$ php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
intl
json
ldap
libxml
mbstring
mysqli
mysqlnd
odbc
openssl
pcntl
pcre
PDO
pdo_dblib
pdo_mysql
PDO_ODBC
pdo_pgsql
pdo_sqlite
pgsql
phalcon
Phar
phpdbg_webhelper
posix
pspell
readline
Reflection
session
shmop
SimpleXML
soap
sockets
sodium
SPL
sqlite3
standard
sysvmsg
sysvsem
sysvshm
tidy
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache
```

モジュール一覧にも出てきているし、よさそう

以前はソースからビルドしていたので、これで結構楽だ
後方互換がないので`git clone git://github.com/phalcon/cphalcon.git -b "3.4.x"`みたいな感じでブランチのバージョン指定したり割とめんどくさかったんだよね。。。

## さいごに
いじってみた感想ですが、Docker上のamznlinux2構築はちょと癖がありましたね
Dockerはデフォルトのユーザがrootユーザなので一般ユーザを追加しないといけなかったり。。。

しかし、上記の問題をクリアすればbrew自体のインストールはすごく簡単にできました
また、brew使ってphpやモジュール周りのインストールも楽でした！

一点気をつけなければいけないのはpath周りですね
通常PHPなどをインストールすれば`/etc`配下にphpディレクトリが作成され、`php.ini`もそこに作成されますが、brewの場合は`/home/linuxbrew/.linuxbrew/etc/`配下になるので注意が必要だと思いました
最初`/etc`配下にphpディレクトリがなく、php.iniが見つけられずちょと困惑しましたw

pathの考慮ができれば、環境構築が捗るのでおすすめです！
是非試してみてください！


### Wantedlyでもブログ投稿してます
Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers