LoginSignup
16
14

More than 5 years have passed since last update.

DockerfileでCrowiのビルドとDocker ComposeでCrowiの実行

Last updated at Posted at 2016-09-11

内容

Crowiをdocker-nodeで動かすまでのメモ

前回はnodeコンテナを立ち上げた後、コンテナ上で作業することでcrowiを動かせるようにした。
今回はそれを整理してDockerfileにし、Dockerfileでイメージをビルドし出来るようにする。
またDocker Composeでnode(crowi), mongodb, redis, +追加でelasticsearchを個々のコンテナで起動するようにする。

参考にしたサイト

https://hub.docker.com/r/bakudankun/crowi/

DockerfileやDocker Composeの方法などで大変参考になりました。感謝。
(ちなみにg++やmake、pythonがなくてもbuildできてるのはcrowiがv1.4.0だったから?)

前準備

以下の構成で3つのファイルを用意する。

ファイル構成
$ tree crowi
crowi
├── Dockerfile
├── docker-compose.yml
└── docker-entrypoint.sh
Dockerfile
FROM node:4.5-slim
MAINTAINER nooby

ENV DOCKERFILE_VERSION v1.0
ENV CROWI_VERSION v1.5.0

# 以下の3ステップ構成でビルド
# 一つのRUNコマンドで実行してるのは生成されるイメージを小さくするため
#
# 1. ビルドに必要なバイナリのインストール
# RUN apt-get update && apt-get install -y \
#     git \
#     g++ \
#     make \
#     python \
# 
# 2. crowiのクローンとビルド
# && git clone -b $CROWI_VERSION https://github.com/crowi/crowi.git \
# && cd /crowi \
# && npm install --unsafe-perm \
# 
# 3. 不要になったパッケージの削除
# && apt-get autoremove -y \
# && apt-get clean \
# && rm -rf /var/lib/apt/lists/* \
# && cd /crowi/node_modules && npm uninstall --save --unsafe-perm \
#     babel* \
#     gulp* \
#     webpack* \
# && rm -rf \
#     /root/.npm \
#     /tmp/*
RUN apt-get update && apt-get install -y \
    git \
    g++ \
    make \
    python \
&& git clone -b $CROWI_VERSION https://github.com/crowi/crowi.git \
&& cd /crowi \
&& npm install --unsafe-perm \
&& apt-get remove -y \
    git \
    g++ \
    make \
    python \
&& apt-get autoremove -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& cd /crowi/node_modules && npm uninstall --save --unsafe-perm \
    babel* \
    gulp* \
    webpack* \
&& rm -rf \
    /root/.npm \
    /tmp/*

ENV PORT ${PORT:-80}
EXPOSE $PORT

# timezoneをjstに
# ref: https://serverfault.com/questions/683605/docker-container-time-timezone-will-not-reflect-changes/683607
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /crowi
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["npm", "start"]
docker-entrypoint.sh
#!/bin/bash

export NODE_ENV=production
export MONGO_URI=${MONGO_URI:-mongodb://mongo:27017/crowi}
export REDIS_URL=${REDIS_URI:-redis://redis:6379/crowi}
export ELASTICSEARCH_URI=${ELASTICSEARCH_URI:-http://elasticsearch:9200/crowi}

exec "$@"
docker-compose.yml
version: '2'

services:
    crowi:
        build:
            context: .
            dockerfile: Dockerfile
        image: node:crowi
        links:
            - mongo:mogo
            - redis:redis
            - elasticsearch:elasticsearch
        ports:
            - 80:80

    mongo:
        image: mongo

    redis:
        image: redis:alpine

    # user: について
    #   commandを指定するとelasticsearchのdocker-entrypoint.shで
    #   user権限切り替えのスクリプトがうまく実行されずrootユーザーのままになる。
    #   root権限ではelasticsearchを実行できないのでuser: elasticsearchを指定する。
    #
    # command: について
    #   crowiの全文検索に必要なanalysis-kuromojiのインストールと、
    #   あると便利そうなウェブコンソールelasticsearch-headのインストールをしてから
    #   elasticsearchを実行
    elasticsearch:
        image: elasticsearch
        user: elasticsearch
        ports:
            - 9200:9200
        command:
            - "sh"
            - "-c"
            - "./bin/plugin install analysis-kuromoji; 
               ./bin/plugin install mobz/elasticsearch-head;
               elasticsearch;"

Dockerfileのビルド

上記のファイル構成の通りにファイルを用意した後、crowiディレクトリに移動しdocker buildコマンドを実行する。

console
$ docker build -t node:crowi .

ビルドには結構時間がかかる。大体10分くらい?

※ docker-compose.ymlにnode:crowiをbuildするコマンドを書いているため、docker-compose upでビルドとコンテナの起動をまとめて行うこともできるが、ビルドだけやたら時間かかるのは気持ちが悪いのでビルドだけ先に実行しておいた。

起動方法と終了方法

起動方法

crowiディレクトリに移動しdocker-compose upを実行する。

console
$ docker-compose up
# docker-compose up -dとするとバックグラウンド実行

起動後、http://localhostにアクセスしCrowiのセットアップ画面が表示されればok。
※ docker for macを使ってる場合はdocker-machine ipでdocker machineのIPを確認し、localhostのかわりにdocker machineのIPを入力

終了方法

ctrl-c(バックグラウンド実行ならdocker-compose stop

Crowi上でElasticsearchの有効化

Crowiにログイン後、管理 -> 検索管理 -> build nowから有効化する。

参考:Crowi公式ブログ

はじめて利用するときに Build Now ボタンを押してインデックスを作成してください。以後はページの作成/更新ごとにインデックスサれるはずです。

ハマった所

余力があれば時間があるときにそれぞれ記事にするかも...

  • Dockerイメージのタイムゾーンの変更
  • Dockerイメージのサイズの縮小化
  • REDIS_URL
  • Elasticsearchのプラグイン

さいごに

今回作成したDockerイメージは後ほどDocker Hubに公開する予定です。

追記 2016-09-11 18:25

GithubとDocker Hubに公開しました。

Github
https://github.com/nooby-noob/docker-node-crowi

Docker Hub
https://hub.docker.com/r/noobynoob/docker-node-crowi/

以下のコマンドでイメージのpull及び各コンテナの立ち上げ、crowiの実行が出来ます。

console
git clone https://github.com/nooby-noob/docker-node-crowi.git
cd docker-node-crowi
docker-compose up

crowi単体でも実行可能です。

console
docker run -p 80:80 noobynoob/docker-node-crowi:v1.5.0

単体で実行する場合は適宜MONGO_URIやREDIS_URLを設定してください。

16
14
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14