.NetCoreをRaspberry Pi上のdockerでパッと動かすPiBakeryレシピ

# .NetCoreをRaspberry Pi上のdockerでパッと動かしたい

[Announcing .NET Core 2.1 | .NET Blog](https://blogs.msdn.microsoft.com/dotnet/2018/05/30/announcing-net-core-2-1/)でアナウンスされたように、.NetCore2.1からAlpineLinuxとARM32がサポートされた。これにより、Raspberry Piのdocker上で.NetCoreを動作させることが可能になった。[PiBakery](https://www.pibakery.org/)を使って、docker上で動く.NetCoreの環境をRaspberry Pi上に作ってみる。

# PiBakery?

Raspberry PiはOSインストールがちょっと面倒だ。PiBakeryを使えば[Scratch](https://scratch.mit.edu/)風のGUIで簡単にセットアップの手順を設定し、ボタン1つでSDカードに書き込みできる。書き込み終わったSDカードをRaspberry Piにセットし、電源を入れればセットアップが全て完了するという優れものだ。Wifiの設定もできるので外付けのキーボードもマウスもつけなくても、即ssh接続が可能になる。じゃあどうせならPiBakeryで、.NetCoreが動くところまで一気に作ってみよう！ということでやってみた。

# PiBakeryレシピの作成

今回最終的に作ったものは[こちら](https://github.com/mochimochiki/PiBakeryScripts)。

```:動作確認環境
Raspberry Pi: Raspberry Pi 3 Model B+
OS: Raspbian Lite (stretch)
Release: 9.3
HostOS: Windows 10 Pro (64bit)
PiBakery: v0.3.8
```

## 1. 基本のセットアップ

[PiBakeryを使ってRaspberryPi Zero Wをヘッドレスでセットアップする](https://qiita.com/cnaos/items/451dbe196b2aafcd050a)
こちらの記事を参考にさせて頂きサクッと。こいつをベースに肉付けしていく。

<img src="https://qiita-image-store.s3.amazonaws.com/0/101002/20ab72b8-113e-72d2-2b98-f7fcad6e304a.png" width=680px>

※最近のバージョンのPiBakeryではdhcpcdの再起動処理がコメントアウトされていて、後ろのブロックにインターネット接続する処理があるとうまくいかなかった。コメントアウトされている以下の処理をSetup Wifi の後ろにRunCommandで書けば再起動される。

```bash
systemctl daemon-reload && sleep 5
systemctl restart dhcpcd && sleep 5
```

## 2. IPアドレス設定

固定IPをRapsberryPiに振る。/etc/dhcpcd.confにstatic ipの情報を追記するため、以下のアドレスを適切に書き換えてPiBakeryのRunCommandで追加。

```bash
echo "interface wlan0" >> /etc/dhcpcd.conf # eth0(LAN cable) or wlan0(wifi)
echo "static ip_address=192.168.xxx.xxx/24" >> /etc/dhcpcd.conf 
echo "static routers=192.168.xxx.xxx" >> /etc/dhcpcd.conf
echo "static domain_name_servers=192.168.xxx.xxx" >> /etc/dhcpcd.conf
```

[参考]

* [【Raspberry Pi 3B/3B+】スタティックなIPアドレス（固定IPアドレス）を設定する - Qiita](https://qiita.com/BearcubThaw/items/cde2494556d609115fb6)
* [sedを使ってdhcpcd.confを書き換える](https://stackoverflow.com/questions/47660306/using-sed-to-change-ip-addresses-in-dhcpcd-conf-file)

## 3. raspi-config（非対話モードで実行）

raspi-configを非対話モードで実行し、ロケールやメモリ節約の設定を行っておく。

```bash
## locale
sudo raspi-config nonint do_change_locale ja_JP.UTF-8
## timezone
sudo raspi-config nonint do_change_timezone Asia/Tokyo
## wifi country
sudo raspi-config nonint do_wifi_country JP
## Save memory usage
### Memory for GPU
sudo raspi-config nonint do_memory_split 16
### Disable Camera
sudo raspi-config nonint do_camera 1
```


[参考]

* [Raspbianのインストールと最強の初期設定 | 純規の暇人趣味ブログ](https://jyn.jp/raspbian-setup/)
* [raspi-configをコマンドラインで実行する。 | ラズパイ好きの日記](https://raspberrypi.mongonta.com/raspiconfig-commandline/)
* [Raspberry Piのメモリーを節約する | ものづくりエクスペリメント](http://denshikousaku.net/save-raspberry-pi-memory)


## 4. Docker環境構築

以下をPiBakeryのコマンドとして追加。

```bash
# curlでdockerのinstallスクリプトを実行
curl -sSL https://get.docker.com | sh
# sudo権限なくてもdockerコマンド使えるようにdockerグループにpiユーザーを追加
sudo usermod -aG docker pi 
# 再起動
sudo systemctl daemon-reload
sudo systemctl restart docker
```

[参考]

* [Raspberry PiにDockerで.NET Core環境を構築してみた](http://eiken7.hatenablog.com/entry/2018/08/02/230615)
* [Proxy環境下のためのDockerの設定 - Qiita](https://qiita.com/homines22/items/00eebe3c36a9591c3803)

## 5. .NetCoreイメージの取得

.Net Core 2.1 の SDK と Runtime イメージをpull。他にもほしいイメージがあれば同様に取得できる。

```docker
docker pull microsoft/dotnet:2.1-runtime
docker pull microsoft/dotnet:2.1-sdk
```

[参考]

* [Building, Running, and Testing .NET Core and ASP.NET Core 2.1 in Docker on a Raspberry Pi (ARM32) - Scott Hanselman](https://www.hanselman.com/blog/BuildingRunningAndTestingNETCoreAndASPNETCore21InDockerOnARaspberryPiARM32.aspx)

# まとめ

![](https://i.imgur.com/rX6VC9G.png)

`Run Command`がずらずらと並ぶ結果になったので正直普通にシェルスクリプトを書いてそれを呼ぶように工夫するほうが良いと思う。もしくは、[PiBakeryには自作のblockを登録する仕組みがある](https://www.pibakery.org/docs/contribute.html)ので、自作ブロックを作っても良い。→[作ってみた。](https://qiita.com/mochimo/items/b3f7c2f7d77283baa7b8)

![](https://i.imgur.com/UdxYNFI.png)

このあとは作成した.NetCoreアプリをスムーズに今回用意したRaspberry Pi上にデプロイし、リモートデバッグできるようにしたいが、とりあえず今回はここまで。