Docker上にTruffle環境を構築する

# はじめに
Docker上にTruffle環境を構築します。
Ganacheと連携させるとコントラクトの履歴やStorageの中身を見ることが出来るようになるので、同じ環境に作成していきたいと思います。
[Docker上にGanache環境を構築する方法はこちら](https://qiita.com/oishii_pg_gohan/items/4d65f149fea18f8e7256)

# バージョン
※執筆時点の筆者の環境です
・Docker: 20.10.8
・Ubuntu: 20.04
・Ganache: 2.5.4
・Truffle: 5.4.9
・Node.js: 14.17.4
・npm: 6.14.14

# 手順
1.Truffleのインストール
※Ganacheとの連携まで載せたかったですが、ボリュームが微妙なので、続きは次回の記事にて。

## 1.Truffleのインストール
前回Ganacheの環境を構築した際はリモートデスクトップでGUIにて操作していましたが、今回はターミナルからアクセスします。

### Gancahe環境のコンテナを起動
※起動済みの場合は飛ばしてください。
※`-i`オプション付与で、起動と同時にターミナルに入ります。

```
docker start -i コンテナ名
```

### Node.jsをインストール
※ここは割愛させていただきますが、私はnvmをインストールして上記バージョンのNode.jsを入れました。

### Truffleのインストール
[公式](https://www.trufflesuite.com/docs/truffle/overview)の手順に従い、インストールしていきます。
といっても`npm install`するくらいですが。

```
npm install -g truffle
```
公式にも下記記載がありますが、NodeJSのバージョンが古いとインストールできないので、気を付けてください。
> NodeJS v8.9.4 or later

インストールが終わるまでには少し時間がかかります。
しばらくすると、、、

```
> node-gyp-build

sh: 1: node-gyp-build: Permission denied
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.3.2 (node_modules/truffle/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/truffle/node_modules/watchpack-chokidar2/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/truffle/node_modules/mocha/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: iso-constants@0.1.2 (node_modules/truffle/node_modules/iso-constants):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: iso-constants@0.1.2 install: `node build.js > index.browser.js`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: spawn ENOENT

npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! bufferutil@4.0.3 install: `node-gyp-build`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the bufferutil@4.0.3 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2021-09-03T14_06_42_625Z-debug.log
```
見事にエラーがでました。。。

本エラーに関しては下記記事にまとめさせていただきました。
※ちょっと理解が怪しいところもありますが、詳細はこちらを参照してください。
[Truffleのインストールに失敗する](https://qiita.com/oishii_pg_gohan/items/dedfbecb1a077045247e)

簡単に言うと、rootユーザーでnode-gyp-buildやっちゃだめよ。
rootでやるなら許可してあげてね。って感じです。
ということで、下記コマンドでrootユーザーを許可してあげます。

```
npm config set unsafe-perm true
```

再度`npm install -g truffle`を叩くと、無事Truffleがインストールされると思います。

バージョンを確認してみて、ひとまず終了です。

```
# truffle --version
Truffle v5.4.9 - a development framework for Ethereum
```

# おわりに
筆者はLinuxを普段触らないため、rootの権限周りで結構詰まりましたが、
解決すればすんなりインストールできるかと思います！
次回はコントラクトの作成やGanacheとの連携部分を書けたらなと思います。

以上ですー。