約1年前に、Dockerを使ってパッとCrowiを導入しました。
以前の記事でも追記していますがdocker-composeのバージョンで挙動が変わったり、docker imageをalpineに変更したりと、ちょこちょこアップデートしたのでまとめておこうと思います。
基本となるファイルはこちらを利用させていただいてます、感謝です。このリポジトリをgit cloneした状態で進めていきます。使用するのはalpineフォルダです。
docker-compose.yml
cloneしたフォルダ直下(alpineフォルダの並列)にdocker-compose.ymlを作成し、以下を記述しています。
version: '3'
services:
crowi:
build:
context: ./alpine
dockerfile: Dockerfile
environment:
- MATHJAX=1
- PLANTUML_URI=http://localhost:18080
env_file: .env
ports:
- 3000:3000
volumes:
- crowi-data:/data
db:
image: mongo:3.6.5
volumes:
- mongo-data:/data/db
redis:
image: redis:4.0.9-alpine
es:
image: docker.elastic.co/elasticsearch/elasticsearch:5.6.4
environment:
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
entrypoint:
- bash
- -c
- >-
elasticsearch-plugin list | grep -q analysis-kuromoji
|| elasticsearch-plugin install analysis-kuromoji
&& exec $$0 $$@
command:
- /bin/bash
- bin/es-docker
plantuml:
image: plantuml/plantuml-server:jetty
ports:
- 18080:8080
volumes:
crowi-data:
driver: local
mongo-data:
driver: local
13行目のコロンより左側の番号がCrowiのポート番号です。環境に応じて変更してください。
また、11行目に指定している.env
ファイルにPASSWORD_SEEDを記述しています。
PASSWORD_SEED=blablablablablablablablabla…
今回私のケースではバージョンアップに伴うalpineへの移行だったので、事前にPASSWORD_SEEDの値を持っていました。新規稼働の場合は1度バックアップデータを作成して中にあるPASSWORD_SEEDを取り出して記述するか、同等のハッシュ値を事前に記述しておいてください。
PASSWORD_SEEDについてや、[1]: max virtual memory areas vm.max_map_count [65530] is too low
とエラーが出てElasticsearchコンテナが起動しない場合の対応は以前の記事をご参考ください。
バックアップとリストア
docker-composeのバージョンによってbackupとrestoreのコマンドが変わってしまうようでは各々のローカル環境および本番環境でコマンドを置き換えるのが面倒です。
なのでバージョンによるコンテナ名まで考慮したShellを作成して使用しています。が、 container_name
を付けて固定化するほうが効率が良いと思います。一応Shellを置いておきます。
backup.sh
#!/bin/bash
# container name's prefix differs depending on docker-compose version
displayed_docker_compose_version=$(docker-compose --version)
if [[ ${displayed_docker_compose_version} =~ ^.*v?([0-9]+)\.([0-9]+)\.([0-9]+).*$ ]]; then
major=${BASH_REMATCH[1]}
minor=${BASH_REMATCH[2]}
fi
prefix="docker-crowi_"
# The prefix has been changed since v1.21.0
if [ "${major}" -le 1 ] && [ "${minor}" -lt 21 ]; then
prefix="dockercrowi_"
fi
app_container_name=${prefix}crowi_1
database_container_name=${prefix}db_1
network_container_name=${prefix}default
rm -rf $(pwd)/crowi $(pwd)/data
mkdir $(pwd)/crowi $(pwd)/data
docker run -it --rm --link ${database_container_name} --network ${network_container_name} --volume $(pwd):/backup mongo:3.6.5 bash -c "mongodump --host ${database_container_name} --db crowi --out /backup"
docker cp ${app_container_name}:/data .
restore.sh
#!/bin/bash
# container name's prefix differs depending on docker-compose version
displayed_docker_compose_version=$(docker-compose --version)
if [[ ${displayed_docker_compose_version} =~ ^.*v?([0-9]+)\.([0-9]+)\.([0-9]+).*$ ]]; then
major=${BASH_REMATCH[1]}
minor=${BASH_REMATCH[2]}
fi
prefix="docker-crowi_"
# The prefix has been changed since v1.21.0
if [ "${major}" -le 1 ] && [ "${minor}" -lt 21 ]; then
prefix="dockercrowi_"
fi
app_container_name=${prefix}crowi_1
database_container_name=${prefix}db_1
network_container_name=${prefix}default
docker run -it --rm --link ${database_container_name} --network ${network_container_name} --volume $(pwd):/backup mongo:3.6.5 bash -c "mongorestore -v --host ${database_container_name} --db crowi backup/crowi"
docker cp ./data ${app_container_name}:.
`docker-compose down`
`docker-compose up -d`
この2つのShellを実行するとバックアップファイル生成と、生成した状態のファイルを復元できます。必要ないと判断したので、docker-composeがインストールされていない場合のエラー処理は行っていません。
実行方法
フォルダ構成
.
├── .env
├── Dockerfile
├── LICENSE
├── README.md
├── alpine
│ ├── Dockerfile
│ ├── LICENSE
│ └── docker-entrypoint.sh
├── backup.sh
├── docker-compose.yml
├── docker-entrypoint.sh
├── example.env
└── restore.sh
起動
docker-compose up -d
停止
docker-compose down
バックアップ
Shellに実行権限を付与(chmod +x backup.sh
)することを忘れずに。
./backup.sh
リストア
Shellに実行権限を付与(chmod +x restore.sh
)することを忘れずに。
./restore.sh
それでは引き続き楽しいCrowiライフを!