Docker for Windows上でのToasterによるYocto project 2.2(morty)イメージの作成法の実践

## 実践動機
現在WindowsホストからYoctoイメージを作成したい場合は大きく二種類の方法がある状況です。
一つはVirtualBox等、ホスト上の仮想マシンにUbuntu等のYocto Linuxイメージ作成用のOSをインストールする手法です。
この手法の問題点として仮想マシンとOSから動作させるため、イメージのビルドに対してOSそのものを動作させる必要があることや単純に仰々しいという点があり、そのため別の手法を模索してみたものです。
他にWindowsホストで使える方法として、Dockerコンテナを利用した方法があります。これには以下のメリットがありました。
- 公式コンテナのイメージがある。
- Toaster(webベースのGUIツールのようなもの)を利用できる。
- 仮想マシン上にOS丸々動作させなくて済む。
~~ちなみに私がVM VirtualBoxにトラウマがあるとかではないです。ちょっと雰囲気が苦手とかそんな程度です。~~
※WSLに関しては2018年12月現在実践した限りではYoctoイメージのビルドが完遂出来ないため、これを仮想環境上のゲストOSと置き換えることはできませんでした。

前置きが長くなりましたが以下から実際に行った手順になります。

## 実践環境
今回私が導入に利用したWindowsホストについては以下のスペックとなります。

|項目  | スペック |
|:----:|:---------------------------------------------------------------:|
|OS    | Microsoft Windows 10 Pro バージョン 1809 ビルド 17763.194         |
|CPU   | AMD Rizen 5 1500X 3.50GHz                                       |
|RAM   | 16GB                                                            |

また、Docker for Windows導入について動作環境が以下を満たしている必要があります。
- Windows 10 Pro 64bit
- Hyper-V使用可能

## Docker for Windows導入
Docker for windowsをホストOS上に導入します。詳細な手順としては以下のURLを参考にして行いました。
[無償の「Docker for Windows」で手軽にLinuxコンテナを利用する](http://www.atmarkit.co.jp/ait/articles/1609/01/news053.html)

Kitematicの導入はWindows PowerShell上から操作するため不要です。

##Dockerコンテナの取得
ToasterのDockerコンテナを[公式](https://github.com/crops/toaster-container)のreadme等を参考に


###作業ディレクトリの作成とDocker Toolboxイメージの取得
管理者権限でPowerShellを実行し、以下のコマンドを入力します。

```powershell:PowerShell
docker volume create --name myvolume
docker run -it --rm -v myvolume:/workdir busybox chown -R 1000:1000 /workdir
```

### Poky Containerの取得と実行
先程のPowerShellに続けて以下のコマンドを入力します。

```powershell:PowerShell
docker run --rm -it -v myvolume:/workdir crops/poky --workdir=/workdir
```

コマンドを実行するとおもむろにshでexecします。CUIでのYocto実行であればここから実施できる様子ですが未確認です。今回はToasterにてイメージを作成するため`ctrl+D`でPowerShellに戻ります。

### Toaster Containerの取得と実行
先程のPowerShellに続けて以下のコマンドを入力します。

```powershell:PowerShell
docker run -it --rm -p 0.0.0.0:18000:8000 -v myvolume:/workdir crops/toaster
```
うまくいった場合、以下のメッセージが表示される。

```powershell:PowerShell
### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'
The system will start.
Check if toaster can listen on 0.0.0.0:8000
OK
/home/usersetup/poky/bitbake/bin/toaster: line 248: kill: (119) - No such process
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages, toastermain, bldcollector, toastergui, humanize
  Apply all migrations: sessions, admin, auth, contenttypes, orm, bldcontrol
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  No migrations to apply.
Starting webserver...
Webserver address:  http://0.0.0.0:8000/
Successful start.
toasteruser@da4419478a3e:/workdir/build$
```


##Toasterによるイメージの作成
コンテナが正常に起動しているホスト機のブラウザを立ち上げ、
[http://localhost:18000](http://localhost:18000)
を開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/326892/b603b799-44bb-f54a-694c-b74346dfc396.png)

Toasterの画面となるため、画面右上のNew Projectを選択し、新しいプロジェクトを作成する。
作成画面では任意のプロジェクト名を設定する。ReleaseバージョンはMortyを選択し、画面下側の
Create projectを選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/326892/28fdf9c8-8ee5-4ab0-5801-35a4ae7ed28b.png)

作成されたプロジェクトの概要がブラウザ上に表示される。デフォルトであればqemux86向けイメージで作成するレシピの選択を行うことでビルドが可能となるため、
*core-image-minimal* などを選択する。
青いボタンで表示されているbuildを選択することで、自動的にイメージの作成が始まる。

##課題点
現在本手順において解決を図りたい今後の課題として以下のものが挙げられる。

1．Poky含めたブランチの切り替え
2．NAT経由でホストPC外からのToaster操作


##追記
Microsoftから発表のあったWSL2によりWindows上でのyoctoビルド環境が整う可能性があります。今後リリース時実験して別記事にまとめます。

以上です。