コマンドをサクッとREST風にHTTPで呼び出すサンプルをpandocに使ってコンテナを作ってみた

# 概要

別エントリで書いた「[REST風にコマンドを呼び出せる(例えばhttp://localhost/bin/date　な)command-as-a-serviceのコンテナを作ってみた](https://qiita.com/hrkt/items/faaddc27c02dbea828c8)」を使って、文書のフォーマット変換を行ってくれる「[pandoc](https://pandoc.org)」を
ラップしてみました。

# TL;DR

[DockerHub](https://cloud.docker.com/u/hrkt/repository/docker/hrkt/pandoc-as-a-service
)にコンテナを置きました。

dockerでコンテナを動かして、

```console
$ docker run -p 8080:8080 hrkt/pandoc-as-a-service
make HTTP POST request
```

curlでアクセスしてみてください。

```console
$ curl "http://localhost:8080/usr/bin/pandoc?-f&markdown&-t&html" --dat-binary @testdata/sample.md
```

この例では、markdownの文書が、htmlとして出力されます。


<details><summary>このmarkdownが</summary><div>

\```
# Level1

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

## Level2

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

### Level3

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\```
</div></details>

<details><summary>このhtmlに</summary><div>


\```
<h1>Level1</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<h2>Level2</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<h3>Level3</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
\```
</div></details>

# 実施したこと

## コンテナ内のコマンドを抜き出して使う

別エントリ「REST風にコマンドを呼び出せる(例えばhttp://localhost/bin/date　な)command-as-a-serviceのコンテナを作ってみた」で作ったコマンドがありましたが、コンテナをAlpineで作っていたおりpandocがパッケージとして用意されていない状態でした。

このため、コンテナを持ってきて、バイナリを抜き出し、Ubuntu19.10のイメージにコピーして使っています。

```dockerfile
# BUILD
FROM hrkt/command-as-a-service:latest as build-stage

# Production
FROM ubuntu:19.10 as production-stage
RUN apt-get update && apt-get install -y \
  musl-dev \
  pandoc
COPY --from=build-stage /command-as-a-service .
COPY app-settings.json .
EXPOSE 8080
CMD ["./command-as-a-service"]

```


## 補足

上記で「musl-dev」を追加していますが、これは「バイナリが「no such file or directory」の時〜またはalpineでビルドしたものを他のlinuxで動かす時にありがちなポイント」に説明を書いています。

# まとめ

これがやりたくて作った簡易REST風ラッパーですが、わりと少ない手数で他のディストリビューションでも使えることが確認できました。

また、このディストリビューションのパッケージが使いたい、という状況では、本エントリのようにコンテナのFROMを取り替えてしまうことで対応できることがわかりました。

## 参照

- GitHub: https://github.com/hrkt/pandoc-as-a-service
- DockerHub: https://cloud.docker.com/repository/registry-1.docker.io/hrkt/pandoc-as-a-service