前回の記事でご紹介したgitbookですが、環境構築の方法はローカルに直接node.jsを入れるものでした。できればローカル環境は汚さず、Dockerで構築できるに越したことはない…と考えておりました。
ググってみると`billryan/gitbook`というイメージが公開されており、`Dockerfile`や`docker-compose.yml`を一切書かず、dockerコマンドをコピペ実行するだけでgitbookを動かすことができます。
ただこのイメージは1.34GBとそこそこ容量を食うため「試すだけなら最小限のリソースで!」→「`Alpine Linux`で何とかできないかな?」と思い立ち、試してみました。
環境はmacOS High Sierra 10.13.6を前提としています。すでにDockerがPCにインストール済みであれば、この項目は読み飛ばしてください。
インストール手順は簡単です。Docker公式でdmgファイルをダウンロードして実行するだけです(ダウンロードの際、アカウント作成が必要になります)。
インストール完了したらターミナルで確認しましょう。
$ docker version Client: Version: 18.03.1-ce API version: 1.37 Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:13:02 2018 OS/Arch: darwin/amd64 Experimental: false Orchestrator: swarm Server: Engine: Version: 18.03.1-ce API version: 1.37 (minimum version 1.12) Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:22:38 2018 OS/Arch: linux/amd64 Experimental: true
まっさらな状態のGitbookに1ファイルだけ追加したリポジトリを作成しました。ローカルに適当なディレクトリを作成し、その中で実行してください。
$ mkdir ~/test && cd ~/test git clone https://github.com/keitavic/gitbook-sample.git Cloning into 'gitbook-sample'... remote: Counting objects: 7, done. remote: Compressing objects: 100% (5/5), done. remote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0 Unpacking objects: 100% (7/7), done. $ ls -l -rw-r--r-- 1 nomura staff 171 9 18 23:54 Dockerfile -rw-r--r-- 1 nomura staff 16 9 18 23:54 README.md -rw-r--r-- 1 nomura staff 69 9 18 23:54 SUMMARY.md -rw-r--r-- 1 nomura staff 106 9 18 23:54 test.md
公開されているAlpine Linuxイメージから、node.js用のイメージを取得してビルドします。`vi ~/test/gitbook-sample/Dockerfile`でDockerfileを作成し、以下のように記述してください。
FROM node:8.12.0-alpine RUN gitbook fetch latest RUN npm install -g gitbook-cli ENV BOOKDIR /gitbook VOLUME $BOOKDIR EXPOSE 4000 WORKDIR $BOOKDIR CMD ["gitbook", "--help"]
$ docker build ./ -t node:8.12.0-alpine Sending build context to Docker daemon 1.328MB Step 1/8 : FROM node:8.12.0-alpine ... ... Successfully tagged node:8.12.0-alpine # 確認 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE node 8.12.0-alpine a9952732684f 4 seconds ago 342MB
Node.js用のAlpine Linuxイメージが追加されました。サイズは342MBで、最小構成の5GB未満と比べるとさすがに容量が増えていますが、`billryan/gitbook`に比べて4分の1程度に抑えることができました。
initからserveまでを実行します。
$ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook init info: create SUMMARY.md info: initialization is finished $ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook install info: nothing to install! $ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook build info: 7 plugins are installed ... ... info: >> generation finished with success in 0.6s ! $ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook serve Live reload server started on port: 35729 ... ... Serving book on http://localhost:4000
ここまで成功すれば、ブラウザで閲覧できる状態になります。ターミナルに出力されている`http://localhost:4000`にアクセスしてみましょう。
上記のコマンドで起動はできていますが、`Serving book on http://localhost:4000`のまま`CTRL+C`も受け付けない状態になっていると思います。
ターミナルを別ウィンドウで立ち上げて、Dockerの状態を確認してみましょう。
# 起動しているコンテナを表示 # CONTAINER IDとNAMESはコンテナ起動ごとに異なる値が割り振られます $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2160abebbf9f node:8.12.0-alpine "gitbook serve" About a minute ago Up 2 minutes 0.0.0.0:4000->4000/tcp reverent_hypatia # 停止はCONTAINER IDもしくはNAMESを指定する $ docker stop 2160abebbf9f $ docker stop reverent_hypatia # dockerコンテナをバックグラウンドで起動 $ docker run -d -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook serve
いかがでしたでしょうか。Dockerfileやdocker-compose.ymlを細かく設定して、いかにイメージの容量を削るかを目指す場合もあるようですが、今回はなるべく軽量・なるべく簡素を目標としてみました。
Dockerには最近触れ始めたばかりですが、すでにバックエンドの技術としてはデファクトスタンダードになっているらしく、少し危機感を覚えています。引き続き学習し、実用に持っていきたいと思います。