Rust製ドキュメントツールmdbookのコンテナ

# 動機
- markdownでドキュメントを書く時に、ある程度の量になった場合、章立てを見ながらファイル参照したくなる。
- このようなときに記述しやすくて、軽くて、パッケージを入れれば数式や図の記述もできる [mdBook](https://rust-lang-nursery.github.io/mdBook/) というものがあることを知った。
- コンテナとして用意して使おうとしたが、オプションの指定でちょっとだけ困ったので、メモとして残しておこうと思う

# 環境
- Ubuntu 18.04

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
$
```

- Docker-ce 19.03.0

```
$ sudo docker --version
Docker version 19.03.0-beta4, build e4666ebe81
$
$ dpkg -l | grep docker-ce
ii  docker-ce                             5:19.03.0~1.4.beta4-0~ubuntu-bionic         amd64        Docker: the open-source application container engine
ii  docker-ce-cli                         5:19.03.0~1.4.beta4-0~ubuntu-bionic         amd64        Docker CLI: the open-source application container engine
$
```

- ファイル構成

tree コマンドの結果は、以下のとおり。treeコマンドがなかったら「sudo apt install tree」しておく。

![tree1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/1908c4e4-8bcb-b2f2-c973-79e7a0d6ac83.png)


# 各ファイルの中身

- Dockerfile

mdbookを [alpine](https://alpinelinux.org/) で使う場合、musl用の*.tar.gzが用意されている。素晴らしい。
「自分でコンパイル」を覚悟していたのでこれはうれしい。

```
# Dockerfile
FROM alpine:3.9

# proxy

# resource
ARG mdbook_dir=/home/mdbook
ARG mdbook_tgz=mdbook-v0.2.1-i686-unknown-linux-musl.tar.gz
ARG mdbook_url=https://github.com/rust-lang-nursery/mdBook/releases/download/v0.2.1/${mdbook_tgz}

# build
RUN apk update && \
    apk --no-cache add curl && \
    apk --no-cache add make sudo tar bash git unzip && \
    rm -rf /var/cache/apk/*

WORKDIR ${mdbook_dir}
RUN curl -L ${mdbook_url} -o ${mdbook_tgz} && \
    tar xf ${mdbook_tgz} && \
    chmod +x ./mdbook && \
    mv ./mdbook /usr/local/bin/mdbook && \
    mdbook init --theme && \
    rm ${mdbook_tgz}

COPY book.toml .
COPY src/ src/

EXPOSE 3000

CMD ["mdbook", "serve", "-d", "/home/mdbook/book"]

```

- Makefile

コンテナ起動時のポイントは、dockerコマンドの--hostnameオプションで指定したホスト名とmdbookコマンドの-nで指定したホスト名をそろえること。dockerコマンドの-pで指定したコンテナ側ポート番号とmdbookコマンドの-pで指定したポート番号が同じこと。

```
# Makefile
src_dir=/home/user1/work/mdbook/src
name := mdbook-alpine
tag := $(name):1.0
port := 3300

build:
        sudo docker build -f ./Dockerfile . -t $(tag)

run:
        sudo docker run -it --rm -d --name $(name) \
                -p $(port):3000 --hostname="mdbook" \
                -v $(src_dir):/home/mdbook/src $(tag) \
                mdbook serve -d /home/mdbook/book -p 3000 -n mdbook

rm:
        sudo docker rm $(name) -f

ps:
        sudo docker ps -a

img:
        sudo docker images

```

- book.toml

タイトル、著者名や、mathjax, mermaidなど併用するツールの設定を好みに応じここに記載する。

```
[book]
authors = ["Yuki Niikura"]
multilingual = false
src = "src"
title = "Sample mdbook"

[output.html]
mathjax-support = true
```

- src/SUMMARY.md

サンプルのため、章立ては適当です。

```

# Summary

- [Chapter 1](./chapter_1.md)
    - [Section_1](./section_1.md)
        - [Subsection_1](./subsection_1.md)
    - [Section_2](./section_2.md)

```

- chapter_1.md 他3ファイル

サンプルのため、中身は適当です

```
$ cat chapter_1.md
# Chapter 1
resources
- [mdBook document](https://rust-lang-nursery.github.io/mdBook/index.html)
- [mermaid](https://github.com/badboy/mdbook-mermaid)
$
$ cat section_1.md
# Section_1
This is Section 1.
$
$ cat section_2.md
# Section_2
This is section 2.
$
$ cat subsection_1.md
# Subsection_1
This is sub section 1.
$
```

# 利用方法
- コンテナのビルド、実行

```
$ make build
$ make run
```

- ブラウザからの参照

コンテナのホストに、実行時に指定した3300番でアクセスし、ドキュメントが見れることを確認する。

![mdbook-example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/b38270d5-cd4e-9415-f59c-d7b7d65222d0.png)