AWS ECSにてカスタムしたredmineのdockerイメージを動かすまでのメモ(その１）

redmineの構築、プラグインの導入をふつーにやると面倒くさい。
あと、一旦構築した後redmineのバージョンをあげるのもやっぱり面倒くさい。

→ので、dockerにてプラグインのインストールやらなにやらを手順をコード化して簡単にRedmineの導入が
できるようにしました。
なお動作環境はAWSのECS(Elastic Container Service)を使います。

## 大きな流れ
1.Dockerfileを用意
2.AWSにてElastic Container Service(ECS)のタスクを定義
3.ECSのインスタンスを用意

今回はまず１を用意します。

## 1.Dockerfileを用意
redmineの公式イメージがdockerhubにあるのでこれをもとにpluginを導入する手順を
dockerfile化していきます。

ポイントは２つです。
1.ベースのイメージはredmine:x.x.x-passengerを利用する
2.DBのマイグレーションが必要ないものはpluginsフォルダに配置し、マイグレーションが必要なものは別フォルダ（install_plugins)に配置。
→コンテナ起動時にマイグレーションを行うようdocker-entrypoint.shに記載しておきます。

### インストールするプラグイン一覧
独断と偏見で入れたプラグインです。

| No               |    プラグインの名前 |    概要    |
|:-----------------|:------------------:|:---------------------------:|
|  1 |              gitmike |        githubの雰囲気のデザインテーマ        |
|  2 |            backlogs |  スクラム開発でおなじみ。ストーリーボード |
|  3 |             redmine_github_hook | redmineとgitを連動|
|  4 |                redmine Information Plugin |  redmineの情報を表示可能         |
|  5 |             redmine Good Job plugin | チケット完了したら「Good Job」が表示      |
|  6 |           redmine_local_avatars | アイコンのアバター       |
|  7 |            redmine_startpage plugin | 初期ページをカスタマイズ       |
|  8 |              clipboard_image_paste |  クリップボードから画像を添付できる　|
|  9 |                Google Analytics Plugin |  閲覧PV測定用   |
| 10 |             redmine_absolute_dates Plugin |  日付を「XX日前」 ではなくyyyy/mm/ddで表示してくれる |
| 11 |           sidebar_hide Plugin |      サイドバーを隠せる       |
| 12 |            redmine_pivot_table |  ピボットテーブルできる画面追加  |
| 13 |              redmine-slack |  指定したslack channnelに通知可能   |
| 14 |                redmine Issue Templates |  チケットのテンプレート |
| 15 |             redmine Default Custom Query | 一覧表示時のデフォルト絞り込みが可能に   |
| 16 |           redmine Lightbox Plugin 2 |      添付画像をプレビューできる       |
| 17 |            redmine_banner Plugin |       画面上にお知らせを出せます       |
| 18 |              redmine_dmsf Plugin |    フォルダで文書管理できる     |
| 19 |                redmine_omniauth_google Plugin |  googleアカウントで認証可能   |
| 20 |             redmine view customize Plugin |  画面カスタマイズがコードで可能       |

### Dockerfile
上記のプラグインをインストール済みとするためのDockerfileです。
なお、ベースイメージは最新(2017/05/19時点）の3.3.3を使用しています。

```shell-session:Dockerfile
FROM redmine:3.3.3-passenger
MAINTAINER xxxxxxxxxxxxxxxxx

#必要コマンドのインストール
RUN apt-get update -y \
 && apt-get install -y curl unzip ruby ruby-dev cpp gcc libxml2 libxml2-dev \
  libxslt1-dev g++ git make xz-utils xapian-omega libxapian-dev xpdf \
  xpdf-utils antiword catdoc libwpd-tools libwps-tools gzip unrtf \
  catdvi djview djview3 uuid uuid-dev \
 && apt-get clean

#timezoneの変更（日本時間)
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV RAILS_ENV production

#gitmakeテーマのインストール
RUN cd /usr/src/redmine/public/themes \
 && git clone https://github.com/makotokw/redmine-theme-gitmike.git gitmike \
 && chown -R redmine.redmine /usr/src/redmine/public/themes/gitmike



#redmine_github_hookのインストール
RUN cd /usr/src/redmine/plugins \
 && git clone https://github.com/koppen/redmine_github_hook.git

#Redmine Information Pluginのインストール
RUN curl http://iij.dl.osdn.jp/rp-information/57155/rp-information-1.0.2.zip > /usr/src/redmine/plugins/rp-information-1.0.2.zip \
 && unzip /usr/src/redmine/plugins/rp-information-1.0.2.zip -d /usr/src/redmine/plugins/ \
 && rm -f /usr/src/redmine/plugins/rp-information-1.0.2.zip

#Redmine Good Job pluginのインストール
RUN curl -L https://bitbucket.org/changeworld/redmine_good_job/downloads/redmine_good_job-0.0.1.1.zip > /usr/src/redmine/plugins/redmine_good_job-0.0.1.1.zip \
 && unzip /usr/src/redmine/plugins/redmine_good_job-0.0.1.1.zip -d /usr/src/redmine/plugins/redmine_good_job \
 && rm -rf /usr/src/redmine/plugins/redmine_good_job-0.0.1.1.zip

#redmine_startpage pluginのインストール
RUN cd /usr/src/redmine/plugins \
 && git clone https://github.com/txinto/redmine_startpage.git

#Redmine Lightbox Plugin 2 Pluginのインストール
RUN cd /usr/src/redmine/plugins \
 && git clone https://github.com/peclik/clipboard_image_paste.git

#Google Analytics Pluginのインストール
RUN cd /usr/src/redmine/plugins \
 && git clone https://github.com/paginagmbh/redmine-google-analytics-plugin.git google_analytics_plugin

#redmine_absolute_dates Pluginのインストール
RUN cd /usr/src/redmine/plugins \
 && git clone https://github.com/suer/redmine_absolute_dates

#sidebar_hide Pluginのインストール
RUN cd /usr/src/redmine/plugins \
 && git clone https://github.com/bdemirkir/sidebar_hide.git

#redmine_pivot_tableのインストール
RUN cd /usr/src/redmine/plugins \
 && git clone https://github.com/deecay/redmine_pivot_table.git

#redmine-slackのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/sciyoshi/redmine-slack.git redmine_slack

#Redmine Issue Templates Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/akiko-pusu/redmine_issue_templates.git redmine_issue_templates

#Redmine Default Custom Query Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/hidakatsuya/redmine_default_custom_query.git redmine_default_custom_query

#Redmine Lightbox Plugin 2 Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/paginagmbh/redmine_lightbox2.git redmine_lightbox2

#redmine_banner Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/akiko-pusu/redmine_banner.git redmine_banner

#redmine_dmsf Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/danmunn/redmine_dmsf.git redmine_dmsf

#redmine_omniauth_google Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/yamamanx/redmine_omniauth_google.git redmine_omniauth_google

#redmine_omniauth_google Pluginのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/onozaty/redmine-view-customize.git view_customize

#redmine_local_avatars用モジュールを用意(インストールはredmine起動時に実施)
RUN cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/ncoders/redmine_local_avatars.git

#backlogsのインストール用モジュールを用意(インストールはredmine起動時に実施)
RUN mkdir /usr/src/redmine/install_plugins \
 && cd /usr/src/redmine/install_plugins \
 && git clone https://github.com/AlexDAlexeev/redmine_backlogs.git \
 && cd /usr/src/redmine/install_plugins/redmine_backlogs/ \
 && sed -i -e '11,17d' Gemfile

#database.ymlファイルを置くフォルダを用意
RUN mkdir /config
COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 3000
CMD ["passenger", "start"]

```

### docker-entrypoint.sh

次にdocker-entrypoint.shファイルです。
githubに公開されているファイル
(https://github.com/docker-library/redmine/blob/41c44367d9c1996a587e2bcc9462e4794f533c15/3.3/docker-entrypoint.sh)
を元にプラグインのインストールを行うコードを記載していきます。


```shell-session:docker-entrypoint.sh
#!/bin/bash
set -e

case "$1" in
	rails|rake|passenger)
		if [ -e '/config/database.yml' ]; then
                	if [ ! -f './config/database.yml' ]; then
				echo "use external database.uml file"
				ln -s /config/database.yml /usr/src/redmine/config/database.yml
			fi
		fi
                if [ -e '/config/configuration.yml' ]; then
                        if [ ! -f './config/configuration.yml' ]; then
                                echo "use external configuration.uml file"
                                ln -s /config/configuration.yml /usr/src/redmine/config/configuration.yml
                        fi
                fi
		if [ ! -f './config/database.yml' ]; then
			if [ "$MYSQL_PORT_3306_TCP" ]; then
				adapter='mysql2'
				host='mysql'
				port="${MYSQL_PORT_3306_TCP_PORT:-3306}"
				username="${MYSQL_ENV_MYSQL_USER:-root}"
				password="${MYSQL_ENV_MYSQL_PASSWORD:-$MYSQL_ENV_MYSQL_ROOT_PASSWORD}"
				database="${MYSQL_ENV_MYSQL_DATABASE:-${MYSQL_ENV_MYSQL_USER:-redmine}}"
				encoding=
			elif [ "$POSTGRES_PORT_5432_TCP" ]; then
				adapter='postgresql'
				host='postgres'
				port="${POSTGRES_PORT_5432_TCP_PORT:-5432}"
				username="${POSTGRES_ENV_POSTGRES_USER:-postgres}"
				password="${POSTGRES_ENV_POSTGRES_PASSWORD}"
				database="${POSTGRES_ENV_POSTGRES_DB:-$username}"
				encoding=utf8
			else
				echo >&2 'warning: missing MYSQL_PORT_3306_TCP or POSTGRES_PORT_5432_TCP environment variables'
				echo >&2 '  Did you forget to --link some_mysql_container:mysql or some-postgres:postgres?'
				echo >&2
				echo >&2 '*** Using sqlite3 as fallback. ***'

				adapter='sqlite3'
				host='localhost'
				username='redmine'
				database='sqlite/redmine.db'
				encoding=utf8

				mkdir -p "$(dirname "$database")"
				chown -R redmine:redmine "$(dirname "$database")"
			fi

			cat > './config/database.yml' <<-YML
				$RAILS_ENV:
				  adapter: $adapter
				  database: $database
				  host: $host
				  username: $username
				  password: "$password"
				  encoding: $encoding
				  port: $port
			YML
		fi

		# ensure the right database adapter is active in the Gemfile.lock
		bundle install --without development test
		if [ ! -s config/secrets.yml ]; then
			if [ "$REDMINE_SECRET_KEY_BASE" ]; then
				cat > 'config/secrets.yml' <<-YML
					$RAILS_ENV:
					  secret_key_base: "$REDMINE_SECRET_KEY_BASE"
				YML
			elif [ ! -f /usr/src/redmine/config/initializers/secret_token.rb ]; then
				rake generate_secret_token
			fi
		fi
		if [ "$1" != 'rake' -a -z "$REDMINE_NO_DB_MIGRATE" ]; then
			gosu redmine rake db:migrate
		fi

		chown -R redmine:redmine files log public/plugin_assets

		if [ "$1" = 'passenger' ]; then
			# Don't fear the reaper.
			set -- tini -- "$@"
		fi
                if [ -e /usr/src/redmine/install_plugins/redmine_backlogs ]; then
                        mv -f /usr/src/redmine/install_plugins/redmine_backlogs /usr/src/redmine/plugins/
                        bundle update nokogiri
                        bundle install
                        bundle exec rake db:migrate
                        bundle exec rake tmp:cache:clear
                        bundle exec rake tmp:sessions:clear
			set +e
                        bundle exec rake redmine:backlogs:install RAILS_ENV="production"
                        if [ $? -eq 0 ]; then
				echo "installed backlogs"
                                touch /usr/src/redmine/plugins/redmine_backlogs/installed
			else
				echo "can't install backlogs"
                        fi
			set -e
			touch /usr/src/redmine/plugins/redmine_backlogs/installed
		fi
                if [ -e /usr/src/redmine/install_plugins/redmine_local_avatars ]; then
                        mv -f /usr/src/redmine/install_plugins/redmine_local_avatars /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
                fi
		if [ -e /usr/src/redmine/install_plugins/redmine_slack ]; then
			mv -f /usr/src/redmine/install_plugins/redmine_slack /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ -e /usr/src/redmine/install_plugins/redmine_issue_templates ]; then
			mv -f /usr/src/redmine/install_plugins/redmine_issue_templates /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ -e /usr/src/redmine/install_plugins/redmine_default_custom_query ]; then
			mv -f /usr/src/redmine/install_plugins/redmine_default_custom_query /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ -e /usr/src/redmine/install_plugins/redmine_lightbox2 ]; then
			mv -f /usr/src/redmine/install_plugins/redmine_lightbox2 /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ -e /usr/src/redmine/install_plugins/redmine_banner ]; then
			mv -f /usr/src/redmine/install_plugins/redmine_banner /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ -e /usr/src/redmine/install_plugins/redmine_dmsf ]; then
			mv -f /usr/src/redmine/install_plugins/redmine_dmsf /usr/src/redmine/plugins/
			bundle install --without development test xapian
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ -e /usr/src/redmine/install_plugins/redmine_omniauth_google ]; then
			mv -f /usr/src/redmine/install_plugins/redmine_omniauth_google /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ -e /usr/src/redmine/install_plugins/view_customize ]; then
			mv -f /usr/src/redmine/install_plugins/view_customize /usr/src/redmine/plugins/
			bundle install --without development test
			bundle exec rake redmine:plugins:migrate RAILS_ENV=production
		fi
		if [ ! -f '/usr/src/redmine/plugins/redmine_backlogs/installed' ]; then
			set +e
			bundle exec rake redmine:backlogs:install RAILS_ENV="production"
			if [ $? -eq 0 ]; then
				echo "installed backlogs"
				touch /usr/src/redmine/plugins/redmine_backlogs/installed
			else
				echo "can't install backlogs"
			fi
			set -e
		fi
		set -- gosu redmine "$@"
                ;;
esac

exec "$@"

```

次はこのイメージをAWSのECSにて動作させます。
（次回に続く）