sioaji2012のブログ

普段は組み込み開発でC言語のみです。主にプログラムや勉強日記です

Redmineプラグインもくもく会 山梨 #003回 開発環境

前回、plugin開発用のRedmineが起動できる様になりました。

qiita.com

こちらのページで、akikoさんが丁寧に説明されているので、説明は不要と思いますが、もくもくの覚え書きとして、僕なりの解釈で説明を書いてみようと思います。

と言いましても、結局Dockerfileを初めて読みまして、ちんぷんかんぷん。でしたので、

Dockerfile 少し勉強しました。

だいたい写経で勉強した次の日には、忘れてしまいます。(^_^;)

なので、ひとまず、もくもくで自分用に書き換えたDockerfileから説明を書いていきます。


その前に、

注意すること

がありました。皆さんはご存知と思いますが。。。

Dockerfileの中で、RUN でコマンドを実行するたびにイメージがコミットされて、 次回、Dockerfileを実行した時は、そのキャッシュが使われる。

つまり、Dockerfileを書き換えても、前のRUN行は再実行されない。


例で説明しますと、

1回目。updateとinstallは実行される。

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl ★この行を修正する

書き換え後、

2回目。updateはキャッシュが使われ古いupdate結果が使われる。(updateは再実行されない)

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl nginx ★この行を修正した

キャッシュを使わないでDockerfile実行する設定にすれば、良いですが時間がかかる。
こう書くのがおすすめっぽい。

FROM ubuntu:14.04
RUN apt-get update && apt-get install -y curl nginx

皆さん、Dockerをどういう用途で使っているのか気になりますが、

もくもくの説明に入りたいと思います。

.-------.
★が説明
.-------.

------------------------------------------
★ruby:2.1.10のイメージをベースにして作成
------------------------------------------
FROM ruby:2.1.10

------------------------------------------
★ラベル(説明省略)
------------------------------------------
LABEL maintainer="K.SUZUKI / (Twitter: @KuniSioaji)" \
  description="Image to run Redmine simply with sqlite to try/review plugin."

------------------------------------------
★コメント(説明省略)
------------------------------------------
#
# You can run target version of Redmine.
# If you use this Dockerfile only, try this:
#    $ docker build -t redmine_stable .
#    $ docker run -d -p 3000:3000 redmine_stable
#
# You can change Redmine version with arg
#    $ docker build --rm --build-arg REDMINE_VERSION=master -t redmine_master .
#    $ docker run -d -p 3000:3000 redmine_master
#

------------------------------------------
★構築(build)時の引数(変数)を指定しなかった時のデフォルト値
★引数でRedmineのバージョンを渡す事で、
 構築するRedmineのバージョンを指定可能にしている。
------------------------------------------
### get Redmine source
ARG REDMINE_VERSION=3.4-stable

------------------------------------------
★Dockerfileのビルドはbashではなくshで実行されるためエラーが出る。
 shをbashへのシンボリックリンクで置き換えることで対応する。
★echo :引数の表示
------------------------------------------
### Replace shell with bash so we can source files ###
RUN rm /bin/sh && ln -s /bin/bash /bin/sh && echo "REDMINE_VERSION: ${REDMINE_VERSION}"

------------------------------------------
★最低限必要なパッケージを追加
------------------------------------------
### install default sys packeges ###
RUN apt-get update && apt-get install -qq -y \
    git vim            \
    sqlite3

------------------------------------------
★Redmineのソースを /tmp/ ディレクトリにgit cloneする 
 (引数でタグバージョン指定してバージョン変更)
★コメント文の方は、安定版(ブランチ)をcloneする場合の記述
★clone先は、/tmp/redmine_coディレクトリとなる。
------------------------------------------
#RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine
RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} --single-branch https://github.com/redmine/redmine redmine_co

------------------------------------------
★引数の表示?
------------------------------------------
RUN echo "REDMINE_VERSION: ${REDMINE_VERSION}"

------------------------------------------
★ WORKDIR
 作業ディレクトリ(/tmp/redmine_coに、cloneしたソースがある)
 以後、このディレクトリでRUN実行されていく。
------------------------------------------
WORKDIR /tmp/redmine_co

------------------------------------------
★SQLite3用のdatabase.ymlをconfig/に作成する
------------------------------------------
RUN echo $'test:\n\
  adapter: sqlite3\n\
  database: /tmp/data_co/redmine_test.sqlite3\n\
  encoding: utf8mb4\n\
\n\
development:\n\
  adapter: sqlite3\n\
  database: /tmp/data_co/redmine_development.sqlite3\n\
  encoding: utf8mb4\n'\
>> config/database.yml

------------------------------------------
★bundle installする
------------------------------------------
RUN gem update bundler
RUN bundle install --without mysql postgresql rmagick test

------------------------------------------
★Redmine本体のマイグレーションをする
------------------------------------------
RUN bundle exec rake db:migrate
RUN bundle exec rake generate_secret_token

------------------------------------------
★CMD:ここまでに作成したイメージで実行するコマンド
    (構築(build)時には、実行しない)
 port 3000で起動する
------------------------------------------
CMD bundle exec rails s -p 3000 -b '0.0.0.0'
EXPOSE 3000

リファレンスより。

※RUN と CMD を混同しないでください。
 RUN が実際に行っているのは、コマンドの実行と結果のコミットです。
 一方の CMD は構築時には何もしませんが、イメージで実行するコマンドを指定します。


今日は、ここまで。 次回は、docker-compose.ymlと、起動などやっていく予定です。


Docker お勉強 04 Docker Compose

もくもくで使わせてもらっている docker-compose.yml が何なのかわからないので調べます。 下記ページを読みながら、覚え書きを記載していきます。

DockerCompose

・Dockerツール群の一つであるDockerComposeを使うと、コンテナ立ち上げ設定をファイル化(yml形式)して管理することが可能になります。
・docker-compose で起動する場合は、Dockerfileを使ってイメージ作成します。

.yml →YAMLファイル →ヤムルファイル

  • データ構造を記述するフォーマットの一つ
  • jsonのスーパーセット(上位互換みたいな感じ)だそう
  • json形式でもymlとして認識してくれるらしい
  • DockerComposeではこのyml形式ファイルを使って、コンテナ起動に関してを記述していきます。
    docker-compose.yml

version:   バージョン番号

Compose file versions and upgrading

現在の最新は '3'

version: '3'

services:   各コンテナに関しての記述を行っていく

services:
  web_co:
  • services構造直下に各コンテナに関しての記述を行っていく。
    次の構造(キー)としては各サービス名となる。(上記:web_co)
  • 立ち上げるコンテナごとに記述内容が異なるはずですので、区分して記述するために構造を分割します。
  • 任意の名前でOK
  • この名前がコンテナの名前になるわけではありません。

build:   構築時に適用するオプションを指定

build で指定できるのは、
・構築用コンテクストのパスを含む文字列
・context の配下にある特定の物(オブジェクト)
・dockerfile のオプション、 引数
build: ./dir

build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1

【もくもく例】

    build:
      context: .
      args:
        REDMINE_VERSION: $REDMINE_VERSION

context:   Dockerfile があるパスや Git URLを指定

・Dockerfile があるディレクトリのパスや Git リポジトリの URL を指定します。
・値に相対パスを指定したら、Compose ファイルのある場所を基準とした相対パスとして解釈します。
・指定したディレクトリが構築コンテクストとなり、Docker デーモンに送信します。
・Compose は生成時の名前で構築・タグ付けし、それがイメージとなります。
build:
  context: ./dir

【もくもく例】

    build:
      context: .

args:   build のオプション(args)

・構築時に build のオプション(args)を追加します。
・配列でも辞書形式(「foo=bar」の形式)も指定できます。
・ブール演算子(true、false、yes、no)を使う場合はクォートで囲む必要があります。
 そうしないと YAML パーサは True か False か判別できません。
・構築時に引数のキーとして解釈する環境変数の値は、Compose を実行するマシン上のみです。
build:
  args:
    buildno: 1
    user: someuser

build:
  args:
    - buildno=1
    - user=someuser

【もくもく例】

    build:
      args:
        REDMINE_VERSION: $REDMINE_VERSION

image:   コンテナの作成元イメージを指定する

・コンテナを実行時に元となるイメージを指定します。
・リポジトリ名・タグあるいはイメージ ID の一部を指定できます。
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
  • すでに存在するimageを探してくれます。
    docker runの時と同じ様にまずローカルのimageから検索して、なければDockerHubからの取得を試みてくれます。
  • イメージが存在していなければ、Compose は pull (取得)を試みます。
    しかし build を指定している場合は除きます。その場合、指定されたタグやオプションを使って構築します。

【もくもく例】

  web_co:
    build:
      context: .
      args:
        REDMINE_VERSION: $REDMINE_VERSION
    image: redmine_co_sqlite3

command:   デフォルトのコマンドを上書きする

デフォルトのコマンドを上書きします。
command: bundle exec thin -p 3000
  • これは Dockerfile の書き方に似せることもできます。
command: [bundle, exec, thin, -p, 3000]

【もくもく例】

    command: >
      bash -c "bundle exec rake redmine:plugins:migrate &&
           bundle exec rails s -p 3000 -b '0.0.0.0'"


⬇Dockerfile側は、こう書いてある⬇

CMD bundle exec rails s -p 3000 -b '0.0.0.0'

(docker run だとプラグインなしでRedmine起動。composeはプラグインつき起動)

environment:   環境変数を追加する

・環境変数を追加します。
・配列もしくは辞書形式(dictionary)で指定できます。
・boolean 値 (true、false、yes、no のいずれか) は、
 YMLパーサによって True や False に変換されないよう、クォートで囲む必要があります。
・キーだけの環境変数は、Compose の実行時にマシン上で指定するものであり、
 シークレット(API鍵などの秘密情報)やホスト固有の値を指定するのに便利です。
environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

【もくもく例】

    environment:
      RAILS_ENV: development

volumes:   コンテナ内にマウントするボリュームを指定する

マウント・パスまたは名前を付けたボリュームは、
・オプションでホストマシン上のパス指定 →( ホスト:コンテナ )
・アクセス・モード →( ホスト:コンテナ:rw )
を指定できます。 

・ホスト上の相対パスをマウント可能です。
・相対パスは Compose 設定ファイルが使っているディレクトリを基準とします。
・相対パスは . または .. で始まります。
volumes:
  # パスを指定したら、Engine はボリュームを作成
  - /var/lib/mysql

  # 絶対パスを指定しての割り当て
  - /opt/data:/var/lib/mysql

  # ホスト上のパスを指定する時、Compose ファイルからのパスを指定
  - ./cache:/tmp/cache

  # ユーザの相対パスを使用
  - ~/configs:/etc/configs/:ro

  # 名前付きボリューム(Named volume)
  - datavolume:/var/lib/mysql

ホスト側のパスを指定せず、 volume_driver を指定したい場合があるかもしれません。

使用するボリュームドライバを指定する
volume_driver: mydriver

【もくもく例】

    volumes:
      - .:/tmp/redmine_co/plugins/redmine_issue_badge

( ホスト:コンテナ )

ports:   公開用のポートを指定する

・公開用のポートです。
・ホスト側とコンテナ側の両方のポートを指定 →( ホスト側:コンテナ側 )
・コンテナ側のポートのみも指定できます(ホスト側はランダムなポートが選ばれます)。

注釈
* ホスト側:コンテナ側 の書式でポートを割り当てる時、コンテナのポートが 60 以下でエラーが発生します。
これは YAML が xx:yy 形式の指定を、60 進数(60が基準)の数値とみなすからです。
そのため、ポートの割り当てには常に文字列として指定することを推奨します。

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"

【もくもく例】

    ports:
      - "3000:3000"

実行オプション docker-compose build

【もくもく例】

 REDMINE_VERSION=master docker-compose build --force-rm --no-cache

rm:   停止済みのサービス・コンテナを削除する

使い方: rm [オプション] [サービス...]

オプション:
    -f, --force   確認なく削除する
    -v            コンテナにアタッチしているアノニマス・ボリュームも削除
    -a, --all     docker-compose run で作成した一度だけのコンテナを全て削除
                  docker-compose run
デフォルトでは、コンテナにアタッチしている匿名ボリューム(anonymous volume)を削除しません。
ボリュームを削除するには -v オプションを使います。
全てのボリュームを表示するには docker volume ls を使います。
(明示的に削除しなければ)ボリューム内にあるデータは失われません。

build:   構築する

使い方: build [オプション] [サービス...]

オプション:
--force-rm  常に中間コンテナを削除
--no-cache  構築時にイメージのキャッシュを使わない
--pull      常に新しいバージョンのイメージ取得を試みる
  • サービスは プロジェクト名_サービス として構築時にタグ付けられます。 例: composetest_db 。
  • サービスの Dockerfile や構築ディレクトリの内容に変更を加える場合は、 docker-compose build で再構築を実行します。

実行オプション docker-compose up

【もくもく例】

docker-compose up -d

up:   サービス用のコンテナの構築、作成、起動、アタッチを行う

使い方: up [オプション] [サービス...]

オプション:
    -d                         デタッチド・モード: バックグラウンドでコンテナを実行し、新しいコンテナ名を表示
                               --abort-on-container-exit と同時に使えない
    --no-color                 白黒で画面に表示
    --no-deps                  リンクしたサービスを表示しない
    --force-recreate           設定やイメージに変更がなくても、コンテナを再作成する
                               --no-recreate と同時に使えません
    --no-recreate              コンテナが既に存在していれば、再作成しない
                               --force-recreate と同時に使えない
    --no-build                 イメージが見つからなくても構築しない
    --build                    コンテナを開始前にイメージを構築する
    --abort-on-container-exit  コンテナが1つでも停止したら全てのコンテナを停止
                               -d と同時に使えない
    -t, --timeout TIMEOUT      アタッチしている、あるいは既に実行中のコンテナを
                               停止する時のタイムアウト秒数を指定 (デフォルト:10 )
    --remove-orphans           Compose ファイルで定義されていないサービス用のコンテナを削除
  • 既に実行している場合は、このコマンドによってリンクされているサービスも起動します。
  • docker-compose up コマンドは各コンテナの出力を統合します。
  • コマンドを終了(exit)すると、全てのコンテナを停止します。
  • docker-compose up -d で実行すると、コンテナをバックグラウンドで起動し、実行し続けます。
  • もしサービス用のコンテナが存在している場合、かつ、コンテナを作成後にサービスの設定やイメージを変更している場合は、 docker-compose up -d を実行すると、 設定を反映するためにコンテナを停止・再作成します(マウントしているボリュームは、そのまま保持します)。
  • Compose が設定を反映させないようにするには、 --no-recreate フラグを使います。
  • Compose で処理時、強制的に全てのコンテナを停止・再作成するには --force-recreate フラグを使います。

ひとまず、ここまで。

【もくもくのdocker-compose.yml】

version: '3'
services:
  # start service for redmine with plugin
  # 1. $ docker-compose build --force-rm --no-cache
  # 2. $ docker-compose up -d
  #
  # If you want to change Redmine's version,
  #
  # 1. $ REDMINE_VERSION=master docker-compose build --force-rm --no-cache
  # 2. $ docker-compose up -d
  #
  #
  web_co:
    build:
      context: .
      args:
        REDMINE_VERSION: $REDMINE_VERSION
    image: redmine_co_sqlite3
    container_name: redmine_co_sqlite3
    command: >
      bash -c "bundle exec rake redmine:plugins:migrate &&
           bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      RAILS_ENV: development
    volumes:
      - .:/tmp/redmine_co/plugins/redmine_issue_badge
    ports:
      - "3000:3000"

Docker お勉強 03 Dockerfile

もくもくで使わせていただいているDockerfileを理解するためにお勉強です。

以下のページを参考に勉強して、もくもくで使ったDockerfileを例にあげて、覚え書きをこちらに記載します。

FROM: ベースイメージの指定

【解説】 Dockerfile リファレンスの FROM 命令 → 本家

可能であれば、自分のイメージの元として現在の公式レポジトリを使います。
私たちは Debian イメージ を推奨します。
これは、非常にしっかりと管理されており、ディストリビューションの中でも最小(現在は 100 MB 以下)になるよう維持されているからです。
FROM <イメージ>
FROM <イメージ>:<タグ>
FROM <イメージ>@<digest>
  • 以降の命令で使う ベース・イメージ を指定する。
  • コメント以外では FROM を一番始めに書く必要がある。
  • 単一の Dockerfile から複数のイメージを作成するため、複数の FROM を指定できる。
    各 FROM 命令ごとに自動的にコミットし、最新のイメージ ID が出力される。
  • タグ や digest 値はオプション。
    省略した場合、ビルダーはデフォルトの latest (最新)とみなす。
    ビルダーは一致する tag 値が無ければエラーを返す。
  • digestは、イメージのユニークな識別子ID (docker images --digestsで表示確認出来る)
    メージ生成後に変更が加えられなければ、digest 値は変更されていないと考えられる。
    v2 以降の形式を使うイメージで使える。

【もくもく例】

FROM ruby:2.1.10

LABEL: コンテナとイメージに付与できるラベル

【解説】Dockerfile リファレンスの LABEL 命令 → 本家

LABEL 命令はイメージにメタデータを追加します。 
LABEL はキーとバリューのペアです。 
LABEL の値に空白スペースを含む場合はクォートを使いますし、コマンドラインの分割にバックスラッシュを使います。

MAINTAINER 命令は現在非推奨

LABEL <key>=<value> <key>=<value> <key>=<value> ...

【例】

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
  • イメージは複数のラベルを持てます。
    可能であれば1つの LABEL にすることをお勧めします。
    複数のラベルを指定したら、各 LABEL 命令は新しいレイヤを準備しますが、多くのラベルを使えば、それだけレイヤを使います。
    次の例は1つのイメージ・レイヤを使うものです。
LABEL multi.label1="value1" multi.label2="value2" other="value3"

上記の例は、次のようにも書き換えられます。

LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"
  • ラベルには、FROM イメージが使う LABEL も含まれています。
    ラベルのキーが既に存在している時、Docker は特定のキーを持つラベルの値を上書きします。
  • イメージが使っているラベルを確認するには、 docker inspect コマンドを使います。

【もくもく例】

LABEL maintainer="K.SUZUKI / (Twitter: @KuniSioaji)" \
  description="Image to run Redmine simply with sqlite to try/review plugin."

ARG: docker build コマンドで使う変数

【解説】Dockerfile リファレンスの ARG 命令 → 本家

ARG 命令は、構築時に作業者が docker build コマンドで使う変数
ARG <名前>[=<デフォルト値>]
  • --build-arg <変数名>=<値> フラグを定義するものです。
    ユーザが構築時に引数を指定しても Dockerfile で定義されていなければ、構築時に次のようなエラーが出ます。
    One or more build-args were not consumed, failing build.
  • 複数の ARG を指定可能です。
  • ARG 命令のデフォルト値を指定できます。
    構築時に値の指定が無ければ、このデフォルト値を使います。
ARG user1=someuser
ARG buildno=1
  • ARG 変数は Dockerfile で記述した行以降で効果があります。ただし、コマンドライン上で引数の指定が無い場合です。

【例】

FROM busybox
USER ${user:-some_user}
ARG user
USER $user
...
$ docker build --build-arg user=what_user Dockerfile

FROM busybox
USER ${user:-some_user}
          → ここまでは、usr=some_user
ARG user
USER $user    → ここからは、usr=what_user (コマンドラインで指定したもの)
...
  • 構築時の変数として、GitHub の鍵やユーザの証明書などの秘密情報を含むのは、推奨される使い方ではありません。

  • ARG や ENV 命令を RUN 命令のための環境変数にも利用できます。
    ENV 命令を使った環境変数の定義は、常に同じ名前の ARG 命令を上書きします。

【例】

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER v1.0.0
RUN echo $CONT_IMG_VER

or

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
$ docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER v1.0.0
RUN echo $CONT_IMG_VER →引数を設定した場合、v2.0.1。指定しない場合、v1.0.0
  • 以下のものは、ARG 命令を記載しなくても、ARG 変数で指定出来ます。
    • HTTP_PROXY
    • http_proxy
    • HTTPS_PROXY
    • https_proxy
    • FTP_PROXY
    • ftp_proxy
    • NO_PROXY
    • no_proxy

※これらを使うには、コマンドラインで --build-arg <変数名>=<値> フラグを単に渡すだけです。

構築キャッシュの影響

キャッシュについてはこちらのページをみて少し勉強しました。
Dockerfileを書く時の注意とかコツとかハックとか

ENV 変数は、値が残り続ける。
ARG 変数は、値が残り続けない。
ARG 変数は、構築キャッシュで残り続ける方法として扱える。

ARG 変数の値が以前の値と違う時は、「キャッシュ・ミス」が発生する。
ARG 変数の値を定義していなくても発生します。
特に、すべての RUN 命令は ARG 変数を(環境変数から)暗黙的に使おうとするため、結果としてキャッシュ・ミスを引き起こす。

【例】

--build-arg CONT_IMG_VER=<値> をコマンドライン上で指定

FROM ubuntu
ARG CONT_IMG_VER 
RUN echo $CONT_IMG_VER 
FROM ubuntu
ARG CONT_IMG_VER
RUN echo hello        → キャッシュ・ミス発生

上記の変更は、3行目でキャッシュミス発生。

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER $CONT_IMG_VER → キャッシュ・ミス発生
RUN echo $CONT_IMG_VER

上記は、ENV コマンドはイメージの中で処理される。キャッシュイメージと値が変わるのでミス発生。

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER hello → キャッシュ・ミス発生しない
RUN echo $CONT_IMG_VER

上記は、ENV コマンドはイメージの中で処理される。キャッシュイメージは、helloの固定値でミス発生しない。

ENVとの使い分け

Dockerfile ARG入門より

  • ENVでは、コンテナ内で環境変数として変数が定義されます。
    ENVを使用する場合は、CMDやENTRYPOINTによって実行されたコマンドに適している。
  • ARG は、 Dockerfileのbuild時に一時的に変数が定義され、コマンドの実行時に展開されます。
    ARGは、変数を展開した状態でコンテナ内にファイルを配置したい場合に有効です。
  • ARGは変数を展開した状態でコンテナに状態を設定するという特性から、コンテナが管理するファイルには有効ですが、 VOLUMEによって管理されているディレクトリに配置されているファイルに対してはENVを使ったほうが便利な場面が多いです。

【もくもく例】

### get Redmine source
ARG REDMINE_VERSION=3.4-stable

RUN: コマンドの実行

【解説】Dockerfile リファレンスの RUN 命令 → 本家

RUN 命令は既存イメージ上の新しいレイヤで、あらゆるコマンドを実行し、その結果をコミットする命令です。
コミットの結果得られたイメージは、 Dockerfile の次のステップで使われます。
ソース・コントロールのように、イメージの履歴上のあらゆる場所からコンテナを作成可能です。

RUN には2つの形式があります。

RUN <コマンド> 
 ・シェル形式、コマンドを実行する。
 ・Linux 上のデフォルトは /bin/sh -c であり、Windows 上 cmd /S /C。

RUN ["実行バイナリ", "パラメータ1", "パラメータ2"] 
 ・exec 形式
  • exec 形式はシェルの文字列を変更できないようにします。
    また、 指定されたシェル実行環境がベース・イメージに含まれなくても RUN コマンドを使えます。
  • デフォルトの shell のシェルを変更するには SHELL コマンドで変更できます。
  • シェル 形式では、RUN 命令を \ (バックスラッシュ)を使い、次の行と連結します。
  • RUN 命令によるキャッシュは自動的に無効化できません。
    RUN apt-get dist-upgrade -y のような命令のキャッシュがあれば、次の構築時に再利用されます。
    RUN 命令でキャッシュを使いたくない場合は、 --no-cache フラグを使います。
    例: docker build --no-cache .

一般的な利用例は apt-get アプリケーションです。
RUN apt-get コマンドは、パッケージをインストールするので、気をつけるべきいくつかの了解事項があります。

RUN apt-get update や dist-upgrade を避けるべきでしょう。
ベース・イメージに含まれる「必須」パッケージの多くが、権限を持たないコンテナの内部で更新されないためです。 もし、ベース・イメージに含まれるパッケージが時代遅れになっていれば、イメージのメンテナに連絡すべきでしょう。
たとえば、 foo という特定のパッケージを知っていて、それを更新する必要があるのであれば、自動的に更新するために apt-get install -y foo を使います。

RUN apt-get updaate と apt-get install は常に同じ RUN 命令文で連結します。以下は実行例です。

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo

RUN 命令文で apt-get update だけを使うとキャッシュ問題を引き起こし、その後の apt-get install 命令が失敗します。
例えば、次のように Dockerfile を記述したとします。

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl

イメージを構築すると、全てのレイヤは Docker にキャッシュされます。
次に、別のパッケージを追加する apt-get install を編集したとします。

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl nginx

Docker は冒頭からファイルを読み込み、命令の変更を認識すると、前のステップで作成したキャッシュを再利用します。しかし、 apt-get update は 決して 実行されず、キャッシュされたバージョンを使います。これは apt-get update が実行されていないためです。そのため、古いバージョンの curl と nginx パッケージを取得する恐れがあります。

そこで Dockerfile でのインストールには RUN apt-get update && apt-get install -y を使うことで、最新バージョンのパッケージを、追加の記述や手動作業なく利用できます。

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo=1.3.*

バージョンを指定すると、何がキャッシュされているか気にせずに、特定バージョンを取得した上での構築を強制します。このテクニックは、必要なパッケージの予期しない変更によって引き起こされる失敗を減らします。

以下は 推奨する apt-get の使い方の全てを示すものです。

RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    lxc=1.0* \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
  • s3cmd 命令行は、バージョン 1.1.* を指定します。
    従来のイメージが古いバージョンを使っていたとしても、新しいイメージは apt-get update でキャッシュを使わないので、確実に新しいバージョンをインストールします。
  • 各行はパッケージのリストであり、パッケージの重複という間違いをさせないためです。
  • 付け加えると、apt キャッシュをクリーンにし、 /var/lib/apt/lits を削除することで、イメージのサイズを減らします。
  • RUN 命令は apt-get update から開始されるので、 apt-get install でインストールされるパッケージは、常に新鮮なものです。

【もくもく例】

1)
FROM ruby:2.1.10
LABEL maintainer="K.SUZUKI / (Twitter: @KuniSioaji)" \
  description="Image to run Redmine simply with sqlite to try/review plugin."

#
# You can run target version of Redmine.
# If you use this Dockerfile only, try this:
#    $ docker build -t redmine_stable .
#    $ docker run -d -p 3000:3000 redmine_stable
#
# You can change Redmine version with arg
#    $ docker build --rm --build-arg REDMINE_VERSION=master -t redmine_master .
#    $ docker run -d -p 3000:3000 redmine_master
#

2)
### get Redmine source
ARG REDMINE_VERSION=3.4-stable
3)
### Replace shell with bash so we can source files ###
RUN rm /bin/sh && ln -s /bin/bash /bin/sh && echo "REDMINE_VERSION: ${REDMINE_VERSION}"

4)
### install default sys packeges ###
RUN apt-get update && apt-get install -qq -y \
    git vim            \
    sqlite3
5)
RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} --single-branch https://github.com/redmine/redmine redmine_co
RUN echo "REDMINE_VERSION: ${REDMINE_VERSION}"
WORKDIR /tmp/redmine_co
6)
RUN echo $'test:\n\
  adapter: sqlite3\n\
  database: /tmp/data_co/redmine_test.sqlite3\n\
  encoding: utf8mb4\n\
\n\
development:\n\
  adapter: sqlite3\n\
  database: /tmp/data_co/redmine_development.sqlite3\n\
  encoding: utf8mb4\n'\
>> config/database.yml
7)
RUN gem update bundler
RUN bundle install --without mysql postgresql rmagick test
RUN bundle exec rake db:migrate
RUN bundle exec rake generate_secret_token
CMD bundle exec rails s -p 3000 -b '0.0.0.0'
EXPOSE 3000
  1. ベースのイメージは、ruby2.1.10にしています。
  2. ARG REDMINE_VERSION というところで、デフォルトでRedmine最新バージョンの安定版を指定
  3. Dockerfileのビルドはbashではなくshで実行されるためエラーが出る。
    shをbashへのシンボリックリンクで置き換えることで対応する。
  4. 最低限必要なパッケージを追加
  5. Redmineのソースを /tmp/ ディレクトリにgit cloneする (引数でタグバージョン指定してバージョン変更)
  6. SQLite3用のdatabase.ymlを作成する
  7. bundle installする
    Redmine本体のマイグレーションをする
    port 3000で起動する

WORKDIR: 作業ディレクト

【解説】Dockerfile リファレンスの WORKDIR 命令 → 本家

WORKDIR 命令セットは Dockerfile で RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令実行時の作業ディレクトリ(working directory)を指定します。
もし WORKDIR が存在しなければ、 Dockerfile 命令内で使用しなくてもディレクトリを作成します。

明確さと信頼性のため、常に WORKDIR からの絶対パスを使うべきです。
また、 WORKDIR を RUN cd ... && 何らかの処理 のように増殖する命令の代わり使うことで、より読みやすく、トラブルシュートしやすく、維持しやすくします。
WORKDIR /path/to/workdir
  • 1つの Dockerfile で複数回の利用が可能です。
    パスを指定したら、 WORKDIR 命令は直前に指定した相対パスに切り替えます。

【例】

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

この Dockerfile を使えば、最後の pwd コマンドの出力は /a/b/c になります。

WORKDIR 命令は ENV 命令を使った環境変数も展開できます。
環境変数を使うには Dockerfile で明確に定義する必要があります。

【例】

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

この Dockerfile を使えば、最後の pwd コマンドの出力は /path/$DIRNAME になります。

【もくもく例】

RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} --single-branch https://github.com/redmine/redmine redmine_co
RUN echo "REDMINE_VERSION: ${REDMINE_VERSION}"
WORKDIR /tmp/redmine_co

CMD: docker runの際に起動するコマンド

【解説】Dockerfile リファレンスの CMD 命令 → 本家

Dockerfile で CMD 命令を一度だけ指定できます。
複数の CMD がある場合、最も後ろの CMD のみ有効です。

CMD の主な目的は、 コンテナ実行時のデフォルトを提供します 。 
デフォルトには、実行可能なコマンドが含まれているか、あるいは省略されるかもしれません。
省略時は ENTRYPOINT 命令で同様に指定する必要があります。

RUN と CMD を混同しないでください。 
RUN が実際に行っているのは、コマンドの実行と結果のコミットです。
一方の CMD は構築時には何もしませんが、イメージで実行するコマンドを指定します。

CMD には3つの形式があります。

■exec 形式、推奨する形式
CMD ["実行バイナリ", "パラメータ1", "パラメータ2"] 

■ENTRYPOINT のデフォルト・パラメータ
CMD ["パラメータ1", "パラメータ2"] 

■シェル形式
CMD <コマンド>
  • シェルあるいは exec 形式を使う時、 CMD 命令はイメージで実行するコマンドを指定します。
  • CMD を シェル 形式で使えば、 <コマンド> は /bin/sh -c で実行されます。

【例】

FROM ubuntu
CMD echo "This is a test." | wc -
  • <コマンド>をシェルを使わずに実行 したい場合、コマンドを JSON 配列で記述し、実行可能なフルパスで指定する必要があります。
    配列の形式が CMD では望ましい形式です 。
    あらゆる追加パラメータは個々の配列の文字列として指定する必要があります。

【例】

FROM ubuntu
CMD ["/usr/bin/wc","--help"]
  • もしコンテナで毎回同じものを実行するのであれば、 CMD と ENTRYPOINT の使用を検討ください。
    詳細は ENTRYPOINT をご覧ください。
  • ユーザが docker run で引数を指定した時、これらは CMD で指定したデフォルトを上書きします。

【補足】

CMD 命令は、イメージに含まれるソフトウェアの実行と、その引数のために使うべきです。
CMD は常に CMD [“executable”, “param1”, “param2”…] のような形式で使うべきです。

そのため、イメージがサービス向け(Apache、Rails 等)であれば、 CMD ["apache2","-DFOREGROUND"] のようにすべきでしょう。
実際に、あらゆるサービスのベースとなるイメージで、この命令形式が推奨されます。

大部分の他のケースでは、 
CMD はインタラクティブなシェル(bash、python、perl 等)で使われます。

たとえば、 CMD ["perl", "-de0"] 、 CMD ["python"] 、 CMD [“php”, “-a”] です。
この利用形式が意味するのは、 docker run -it python のように実行すると、それを使いやすいシェル上に落とし込み、すぐに使えるようにします。 
あなたとあなたの想定ユーザが ENTRYPOINT の動作になれていない限り、CMD を ENTRYPOINT と一緒に CMD [“パラメータ”, “パラメータ”] の形式で使うべきではないでしょう。

【もくもく例】

RUN gem update bundler
RUN bundle install --without mysql postgresql rmagick test
RUN bundle exec rake db:migrate
RUN bundle exec rake generate_secret_token
CMD bundle exec rails s -p 3000 -b '0.0.0.0'
EXPOSE 3000

EXPOSE: コンテナ内のプロセスがListenするポート

【解説】 Dockerfile リファレンスの EXPOSE 命令 → 本家

EXPOSE 命令は、コンテナが接続用にリッスンするポートを指定します。
そのため、アプリケーションが一般的に使う、あるいは、伝統的なポートを使うべきです。
例えば、Apache ウェブ・サーバのイメージは、 EXPOSE 80 を使い、
MongoDB を含むイメージは EXPOSE 27017 を使うでしょう。

外部からアクセスするためには、ユーザが docker run 実行時にフラグを指定し、
特定のポートを任意のポートに割り当てられます。
コンテナのリンク機能を使うと、Docker はコンテナがソースをたどれるよう、環境変数を提供します(例: MYSQL_PORT_3306_TCP )。
EXPOSE <port> [<port>...]
  • EXPOSE 命令は、特定のネットワーク・ポートをコンテナが実行時にリッスンすることを Docker に伝えます。
  • EXPOSE があっても、これだけではホストからコンテナにアクセスできるようにしません。
    アクセスするには、 -p フラグを使ってポートの公開範囲を指定するか、 -P フラグで全ての露出ポートを公開する必要があります。
    外部への公開時は他のポート番号も利用可能です。
  • ホストシステム上でポート転送を使うには、 -P フラグを使う をご覧ください。
  • Docker のネットワーク機能は、ネットワーク内でポートを公開しないネットワークを作成可能です。
    詳細な情報は 機能概要 をご覧ください。

Dockerfile コマンドについては、一旦ここまで。

Docker お勉強 02 各種dockerコマンドのまとめ

ここまでの

各種dockerコマンドのまとめ

その他のコマンドについては、公式ページ「 Docker Documentation – docker 」から確認できます。 docker | Docker Documentation

Dockerイメージ取得、イメージ一覧確認

# docker pull <Dockerイメージ名>

# docker images

※公開されているDockerイメージを管理しているところからダウンロードしたり、自分でDockerイメージを作成したりすることで初めて一覧に表示されます。

コンテナ起動、コンテナ一覧確認

※Dockerコンテナとは、Dockerイメージをもとに起動させたコンテナのことを指します。

# docker run -it -d -p <ホスト側ポート>:<コンテナ側ポート> -v <ホスト側ディレクトリ>:<コンテナ側ディレクトリ> --name <コンテナ名> <Dockerイメージ名>

# docker ps -a
※「-p」「-v」オプション以外にも多数のオプションがあります。

コンテナへのログイン

# docker exec -it <コンテナ名> bash

ファイルコピー

(ホスト→コンテナ内)
# docker cp <ホスト側のファイル> <コンテナ名>:<コンテナ内のコピー先ディレクトリ>

(コンテナ内→ホスト)
# docker cp <コンテナ名>:<コンテナ内のコピー元ファイル> <ホスト側のコピー先ディレクトリ>

コンテナからDockerイメージ作成

# docker commit <コンテナ名> <作成するDockerイメージ名>

コンテナ起動、停止

# docker start <コンテナ名>

# docker stop <コンテナ名>

コンテナ削除

# docker rm (-f) <コンテナ名>
※「-f」オプションを付けると、コンテナ起動中でも強制的に削除します。

Docker お勉強 01 起動・イメージ作成

Redmineプラグインのもくもくをやるのに、Dockerで開発環境を準備する事にしたけれど、使い方を全く知らないので少しづつお勉強します。

さくらのナレッジ の Docker入門でお勉強して、覚え書きをここへ記載します。

knowledge.sakura.ad.jp

公開されているDockerイメージを使用し、コンテナの基本的な操作

Dockerイメージ、コンテナのライフサイクル

  1. 公開されているDockerイメージの取得
  2. それをもとにコンテナを起動
  3. コンテナの停止・削除
  4. Dockerイメージの削除

公開されているDockerイメージの取得

「hello-world」というDockerイメージを使用して、コンテナを起動。

 # docker run hello-world

このhello-worldイメージは、コンテナ起動をしたら、コンテナの中でメッセージを出力するようなDockerイメージとなっています。

docker run

Dockerイメージを使用して、コンテナを起動するコマンド

※最初はローカル環境にはDockerイメージはありません。そのため、Docker Hubに探しに行き、存在すればDockerイメージをダウンロードします。

コンテナの状態
# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          
c1b9013f9f66   hello-world   "/hello"   27 minutes ago 
  
STATUS                      PORTS   NAMES
Exited (0) 27 minutes ago           distracted_swirles
CONTAINER ID コンテナのID 備考
IMAGE 使用したDockerイメージ
COMMAND コンテナ起動時にコンテナ内で実行するコマンド
CREATED コンテナを作成したタイミング
STATUS コンテナ状態 Exited:停止中
Up: 起動中
PORTS ポートフォワード設定
NAMES コンテナの名前

※コンテナの名前は、指定しなければ自動で設定されます。

(コンテナの名前の指定の仕方は後ほど)

※ コンテナは、1プロセスは動いている必要があります。

 今回のhello-worldイメージでは、メッセージを出力するだけのプロセスだったため、そのプロセスが終了したタイミングでコンテナは停止しています。

Dockerコンテナ、イメージを削除する

コンテナ一覧

# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          
c1b9013f9f66   hello-world   "/hello"   27 minutes ago   

STATUS                      PORTS   NAMES
Exited (0) 27 minutes ago           distracted_swirles

※停止中のものをそのままにしておくと、ゴミデータが残ったままになったり、ディスク圧迫にもつながるので、不要になったものは削除を忘れないようにしましょう。

※「docker ps」(「-a」を付けない)と実行すると、停止中のコンテナは表示されないので、注意してください。

 気づいたらたくさんの不要コンテナが溜まっていた、ということにもなりかねません。

イメージ一覧

# docker images
REPOSITORY    TAG      IMAGE ID       CREATED        SIZE
hello-world   latest   f2a91732366c   3 months ago   1.85kB

※イメージについても、不要なイメージは削除しましょう。

 特に、JenkinsなどのCI(Continuous Integration) ツールを使用して、Dockerイメージの作成やコンテナ起動を自動で実行するような場合、気づかないうちに不要データが残り続けて、ディスクを圧迫することになるので注意しましょう。

 (Disk Fullを起こすと、Docker環境の復元も困難になる場合があるので、十分注意したほうが良いです。)

コンテナを削除
# docker rm <コンテナ名>
または
# docker rm <CONTAINER ID>

例:

docker rm distracted_swirles
docker rm c1b9013f9f66
Dockerイメージの削除

コンテナを削除しても、Dockerイメージまでは削除されません。

# docker rmi <Dockerイメージ名> 
または
# docker rmi <IMAGE ID> 

例:

# docker rmi hello-world
または
# docker rmi f2a91732366c

Nginxイメージを使ってコンテナを動かしてみる

NginxのDockerイメージを取得

# docker pull nginx

取得したNginxイメージを使用してコンテナを起動

Nginxコンテナが起動するので、8181ポートに外からアクセスできるように設定すれば(Firewallなど)、以下のURLでNginxにアクセスすることができます。

http://<作成したインスタンスIPアドレス>:8181/

# docker run -d --name nginx-container -p 8181:80 nginx

実行コマンドのオプション

オプション 説明
-d コンテナをバックグラウンド実行します。
このオプションを付けない場合、コンテナ起動時に実行されるコマンドを実行した状態になり、例えばそのコマンドのコンソール出力が表示された状態になります。
–name コンテナ名を指定します。
(指定しない場合、自動で名前がつく)
-p ホストとコンテナ間のポートフォワード設定。
基本的には、「-p <ホスト側のポート>:<コンテナ側のポート>」で書きます。
(ホスト側を省略すると自動で設定されます。)
コンテナは、Dockerにより作成されるネットワークに属するため、このオプションを使わないと、ホストのIPアドレスを用いて、コンテナで使用しているポートにはアクセスができません。

コンテナ状態を確認

Nginxイメージの場合は、コンテナ起動時にnginxプロセスが実行されたままの状態になるため、コンテナも停止せずに起動状態となります。

docker ps コマンドで見てみると、STATUSが「Up」となっています。

# docker ps -a
CONTAINER ID   IMAGE   COMMAND                  CREATED      
a61413193f44   nginx   "nginx -g 'daemon ..."   7 days ago   

STATUS         PORTS                  NAMES
Up 8 seconds   0.0.0.0:8181->80/tcp   nginx-container

コンテナを停止する

# docker stop nginx-container
nginx-container

Proxy配下でDockerを使用する場合

Docker CEの場合

# mkdir -p /etc/systemd/system/docker.service.d
# vi /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://<プロキシサーバのIPアドレス>:<プロキシサーバのポート>/ HTTPS_PROXY=http://<プロキシサーバのIPアドレス>:<プロキシサーバのポート>/" 

# systemctl daemon-reload
# systemctl restart docker

Docker for Mac/Windowsの場合 メニューからたどる

preferences > proxies

公開Dockerイメージにミドルウェアやアプリをインストールして利用する

CentOSのDockerイメージをもとにTomcatが動くコンテナを構築するなかで、各種dockerコマンドについて説明します。

また、自分で構築したコンテナから、Dockerイメージを作成し、使用します。

CentOSのDockerイメージを取得し、コンテナを起動する

(docker runの「-v」オプションについては、この後説明する)

[ホスト]

# docker pull centos:7
# mkdir -p /root/tomcat-container/logs
# docker run -it -d -p 18080:8080 -v /root/tomcat-container/logs:/share/logs --name tomcat centos:7
  • 「/root/tomcat-container/logs」は任意のディレクトリで良い。
  • mkdir -pオプション(--parentsオプション)
ディレクトリが存在していてもエラーメッセージを表示せず、
現在あるディレクトリはそのままにして新規に作成することはなく子ディレクトリを作成する。
CentOSコンテナの中でTomcatインストール

今回使用しているCentOSのDockerイメージでは、インストール済みのコマンドは限られています。

そのため、必要に応じてyumなどでインストールする必要があります。

まず、Tomcatをホスト側にダウンロード

コンテナの中でダウンロードも可能です。

今回は、ホスト側からコンテナへのファイルコピー方法を示すため、このような手順にしています。

[ホスト]

# wget http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.6/bin/apache-tomcat-9.0.6.tar.gz
以下のコマンドでホスト側からコンテナ内にファイルをコピー

[ホスト] docker cp <ホスト側のファイル> <コンテナ名>:<コンテナ内のコピー先ディレクトリ>

# docker cp apache-tomcat-9.0.6.tar.gz tomcat:/opt/

また、コンテナからファイルを取得することも可能です。以下のようなコマンドになります。

docker cp <コンテナ名>:<コンテナ内のコピー元ファイル> <ホスト側のコピー先ディレクトリ>

コンテナにログイン

[ホスト]

# docker exec -it tomcat bash

docker exec [オプション] [コンテナ] [コマンド] [引数...]

オプション 説明
-d, --detach 指定したコマンドをコンテナ内でバックグラウンドで実行します。
-e, --env <定義> 指定したコマンドを実行する際に環境変数を適用します。
-i, --interactive 指定したコマンドを実行した後、コンテナの標準入力をDockerホストの標準入力と接続します。
-t, --tty コンテナ内で疑似的な仮想端末を割り当てて、Dockerホストの標準出力と接続します。
--privileged 指定したコマンドを特権モードで実行します。
-u, --user 指定したコマンドを特定ユーザで実行します。
-w, --workdir コンテナ内でコマンドを実行する際の作業ディレクトリが指定できます。

コンテナ内でTomcatのインストール

[コンテナ内]

# yum install -y java
# cd /opt/
# tar zxf apache-tomcat-9.0.6.tar.gz
# cd apache-tomcat-9.0.6
# ./bin/startup.sh

これでTomcatが起動しました。物理マシン上にインストールする場合と基本同じです。

ブラウザで以下にアクセスすれば、Tomcatの画面が開きます。

docker runコマンドの「-p」オプションでホスト側の18080ポートをコンテナ内の8080にポートフォワードするようにしているので、18080ポートを使用することになります。

http://:18080/

これでTomcatのコンテナができました。
自分でWebアプリケーションを作成していたら、Tomcat配下のwebappsディレクトリに配置すれば、コンテナ内で自分のアプリケーションを起動させることができます。

ホスト側とのディレクトリ共有

注意点

Tomcatのログはコンテナのディレクトリにあります。

そのため、コンテナが停止してしまったら、ログを取得するために再度コンテナを起動させる必要があります。

また、もしコンテナが削除されてしまった場合は、ログの取得すらできなくなってしまいます。

実際に運用しているサービスでログが取得できないのは大きな問題です。

解決する方法

ホスト側とコンテナのディレクトリを共有させる方法があります。

docker run「-v」オプションが、その設定になります。

コロンの左側(/root/tomcat-container/logs)がホスト側、右側(/share/logs)がコンテナ内のディレクトリを表していて、そのディレクトリが共有されるかたちとなります。

Tomcatログはデフォルトのディレクトリ(/opt/apache-tomcat-9.0.6/logs)に出力されているので、コンテナにログインして、ログ出力先を変えましょう。

[コンテナ内]

# cd /opt/apache-tomcat-9.0.6/
# sed -i -e "s/\${catalina.base}\/logs/\/share\/logs/g" ./conf/logging.properties
# ./bin/shutdown.sh
# ./bin/startup.sh
# ls -la /share/logs/

コンテナ内で/share/logs/配下にログが出力されていることが確認できます。

次にホスト側で確認します。

新しいコンソールを開くか、コンテナからログアウト(exit)し、ホスト側のディレクトリ(/root/tomcat-container/logs/)を確認してみてください。

[ホスト]

# ls -la /root/tomcat-container/logs/

これでコンテナが停止しても、ホスト側でログを確認することができます。

試しにコンテナを停止

[ホスト]

# docker stop tomcat
tomcat

これでコンテナが停止しました。

先ほど確認したホスト側のディレクトリ(/root/tomcat-container/logs/)を確認してみるとログが残っているはずです。

その他、ホスト側とコンテナ内でディレクトリ共有する目的の例としては、以下のようなケースがあります。

・設定ファイルをホスト側においておき、その設定ファイルをコンテナ内で使用する。
・ソースコードがあるディレクトリを共有させて、コンテナ内でビルドやユニットテストを実行できるようにする。

コンテナからDockerイメージを作成し、使用する。

ここで作成したコンテナを削除してしまうと、もう一度同じコンテナを使いたいとなった場合に、再度同じ手順を踏む必要があります。

(また、同じものを増やしたい場合に、再度Tomcatインストールから行うのは手間です)

Dockerイメージにすることで、そのイメージを使ってコンテナ起動すれば、既に各種ミドルウェアなどがインストールされた状態のコンテナを起動することができます。

Dockerイメージを作成する方法は、以下の方法があります。

  1. Dockerfileを使用してDockerイメージを作成する
  2. コンテナからDockerイメージを作成する
Dockerfile

今回実施したインストールコマンドなどを書いたファイル。

手順がそのままコード化された状態となり、再現性も担保できるようになります。

具体的には以下のような内容になります。

FROM centos:7
RUN yum install -y java
CMD ["/bin/bash"]
コンテナからDockerイメージを作成
  • 現状のコンテナ状態をDockerイメージにするコマンドがあります。
    このやり方だと、そのDockerイメージは何の操作をしてできたものなのかもわからない状態になってしまいます。
  • Dockerイメージの作成は、基本的には 1.のDockerfileを使用したやり方がよい。
    (Docker Hubで公開されているDockerイメージも、それぞれDockerfileが公開されていて、それを元に作成されたイメージです。)
    暫定的にDockerイメージにしておきたい場合などに行うくらいが良い。
まず、コンテナを停止

[ホスト]

# docker stop tomcat
コンテナ名を指定し、Dockerイメージを作成

[ホスト]

docker commit <コンテナ名> <作成するDockerイメージ名>

# docker commit tomcat tomcat-image
新しくDockerイメージができたことを確認

[ホスト]

# docker images

作成したDockerイメージを使用してコンテナ起動

[ホスト]

コマンドの一番後ろで、作成したDockerイメージの「tomcat-image」を指定しています。

ホスト側のポートと、ホスト側の共有ディレクトリについては、最初に起動したコンテナとは被らないようにしましょう。

# mkdir -p /root/tomcat-container/logs2
# docker run -it -d -p 18082:8080 -v /root/tomcat-container/logs2:/share/logs --name tomcat2 tomcat-image

コンテナ状態を確認してみます。

[ホスト]

tomcat2という名前のコンテナが起動しています。

また、IMAGEのところを見ると「centos:7」ではなく、「tomcat-image」になっています。

# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             
72472672e66b   tomcat-image   "/bin/bash"   5 seconds ago       
4ba6f6f55040   centos:7       "/bin/bash"   About an hour ago   

STATUS                            PORTS                     NAMES
Up 2 seconds                      0.0.0.0:18082->8080/tcp   tomcat2
Exited (137) About an hour ago                              tomcat

実際にコンテナの中を確認し、Tomcatも起動してみます。

[ホスト]

# docker exec -it tomcat2 bash

[コンテナ内]

# ls /opt
apache-tomcat-9.0.6 apache-tomcat-9.0.6.tar.gz
(Tomcatディレクトリが確かに存在します)
# cd /opt/apache-tomcat-9.0.6
# ./bin/startup.sh

ブラウザから以下にアクセスするとTomcat画面が見れるはず。

(新しく起動したコンテナのホスト側のポートは18082にした)

http://:18082/

停止したコンテナは、以下のコマンドで再度起動することができます。

18080ポートでアクセスすれば、最初に起動したコンテナ側に接続できます。

[ホスト]

# docker start tomcat
# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED          
72472672e66b   tomcat-image   "/bin/bash"   45 seconds ago   
4ba6f6f55040   centos:7       "/bin/bash"   5 seconds ago    

STATUS          PORTS                     NAMES
Up 45 seconds   0.0.0.0:18082->8080/tcp   tomcat2
Up 5 seconds    0.0.0.0:18080->8080/tcp   tomcat

Redmineプラグインもくもく会 山梨 #002回 開発環境

前回の続き

引数でバージョンを切り替える様に出来るか検討しよう。

docker-compose.ymlを引数対応に戻します。

REDMINE_VERSION: 3.4-stable

⬇

REDMINE_VERSION: $REDMINE_VERSION

3.3-stable を試す

3.3-stable は、ruby 2.3までしか対応していないので、Dockerfileを修正。 動作環境はこちら*1で調べた。

Dockerfile

FROM ruby:2.4.2

⬇

FROM ruby:2.2.2

起動

$ REDMINE_VERSION=3.3-stable docker-compose build --no-cache
$ docker-compose up -d

http://localhost:3000 でredmineの起動確認 3.3-stableでRedmineが起動出来た。

タグ指定で起動する

会社のバージョンで起動したい。tag 3.3.2/ ruby 2.1.10

Dockerfile

FROM ruby:2.2.2

RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine

⬇

FROM ruby:2.1.10

RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} --single-branch https://github.com/redmine/redmine redmine

起動

$ REDMINE_VERSION=3.3.2 docker-compose build --no-cache
$ docker-compose up -d

http://localhost:3000 でredmineの起動確認 3.3.2でRedmineが起動出来た。

Environment:
  Redmine version                3.3.2.stable
  Ruby version                   2.1.10-p492 (2016-04-01) [x86_64-linux]
  Rails version                  4.2.7.1
  Environment                    development
  Database adapter               SQLite
SCM:
  Subversion                     1.8.10
  Mercurial                      3.1.2
  Bazaar                         2.7.0
  Git                            2.1.4
  Filesystem                     
Redmine plugins:
  no plugin installed

※Git clone でのタグの指定方法は良く知らないので、少し不安があります。 実際に下記の様に、注意ログが表示されています。

Step 7/16 : RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} --single-branch https://github.com/redmine/redmine redmine
 ---> Running in a61fdf32f412
Cloning into 'redmine'...
Note: checking out '7827d9cdf8c0f198b776bcd88881a57d83390ee1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

Removing intermediate container a61fdf32f412
 ---> a81d4d34b36b

次回は、このイメージを使って、プラグイン開発する方法を考える

結局、Dockerの勉強が必要になるかも。


Redmineプラグインもくもく会 山梨 #001回 開発環境

前回のもくもく開発環境 準備のつづきです。

もう一度、docker-compose build でエラーを確認します。*1

エラー表示

warning: Could not find remote branch :-3.4-stable to clone.

fatal: Remote branch :-3.4-stable not found in upstream origin

ERROR: Service 'web' failed to build: The command '/bin/sh -c cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine' returned a non-zero code: 128 

エラー表示の前にワーニング表示がある。

git clone でブランチが見つからない。と言っているのかな。

 

Dockerファイルの記述*2では、 

RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine

とあるので、

Docker使わず、ターミナルから適当なフォルダにクローンしてみます。

git clone --depth 1 -b 3.4-stable https://github.com/redmine/redmine redmine

こちらは、うまくCloneできたので、記述は正しいと思う。*3

mbp:test sioaji$ git clone --depth 1 -b 3.4-stable https://github.com/redmine/redmine redmine

Cloning into 'redmine'...

remote: Counting objects: 2176, done.

remote: Compressing objects: 100% (1930/1930), done.

remote: Total 2176 (delta 402), reused 909 (delta 173), pack-reused 0

Receiving objects: 100% (2176/2176), 2.66 MiB | 2.33 MiB/s, done.

Resolving deltas: 100% (402/402), done.

Checking out files: 100% (2115/2115), done.

 

 念のため、Dockerfileのバージョン指定を直書きにして、実行してみる。

RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine

RUN cd /tmp && git clone --depth 1 -b 3.4-stable https://github.com/redmine/redmine redmine

 

これで、ビルドが通った。Redmineも起動した。 

mbp:redmine_my_plugin sioaji$ docker-compose build

WARNING: The REDMINE_VERSION variable is not set. Defaulting to a blank string.

Building web

Step 1/16 : FROM ruby:2.4.2

 ---> 2a867526d472

Step 2/16 : LABEL maintainer="AKIKO TAKANO / (Twitter: @akiko_pusu)"   description="Image to run Redmine simply with sqlite to try/review plugin."

 ---> Using cache

 ---> 884cc8d12364

Step 3/16 : ARG REDMINE_VERSION="3.4-stable"

 ---> Using cache

 ---> 4006a4d4df42

Step 4/16 : RUN rm /bin/sh && ln -s /bin/bash /bin/sh && echo "REDMINE_VERSION: ${REDMINE_VERSION}"

 ---> Using cache

 ---> 1631495b43da

Step 5/16 : RUN apt-get update

 ---> Using cache

 ---> 7eef7875f956

Step 6/16 : RUN apt-get install -qq -y     git vim                sqlite3

 ---> Using cache

 ---> 08e3c2253160

Step 7/16 : RUN cd /tmp && git clone --depth 1 -b 3.4-stable https://github.com/redmine/redmine redmine

 ---> Running in 7c7720d00975

Cloning into 'redmine'...

Removing intermediate container 7c7720d00975

 ---> 16264bd2fbd3

Step 8/16 : RUN echo "REDMINE_VERSION: ${REDMINE_VERSION}"

 ---> Running in 9fc9c5ce814b

REDMINE_VERSION: :-3.4-stable

Removing intermediate container 9fc9c5ce814b

 ---> da1b53ae020f

Step 9/16 : WORKDIR /tmp/redmine

 

docker-compose upでサーバー起動し、

mbp:redmine_my_plugin sioaji$ docker-compose up

WARNING: The REDMINE_VERSION variable is not set. Defaulting to a blank string.

Creating redmine_sqlite3 ... done

Attaching to redmine_sqlite3

redmine_sqlite3 | [2018-04-11 13:55:22] INFO  WEBrick 1.3.1

redmine_sqlite3 | [2018-04-11 13:55:22] INFO  ruby 2.4.2 (2017-09-14) [x86_64-linux]

redmine_sqlite3 | [2018-04-11 13:55:22] INFO  WEBrick::HTTPServer#start: pid=9 port=3000

redmine_sqlite3 | => Booting WEBrick

redmine_sqlite3 | => Rails 4.2.8 application starting in development on http://0.0.0.0:3000

redmine_sqlite3 | => Run `rails server -h` for more startup options

redmine_sqlite3 | => Ctrl-C to shutdown server

http://localhost:3000 でredmineの起動確認 OKでした。

 

一旦、起動したRedmineを停止。(下記コマンドで良いか。少し自身ないです)

$ Ctrl + C

$ docker-compose down

 

エラーを見直すと、

fatal: Remote branch :-3.4-stable not found in upstream origin

となっていて、『:-3.4-stable』が無いと言っている。

(『3.4-stable』となっていない)

 

 また、docker-compose.ymlの記述 *4 には、

args:
REDMINE_VERSION: $REDMINE_VERSION:-3.4-stable

と書かれているので、この『-3.4-stable』を『3.4-stable』に修正してみたいけど、、。 

昨日のエラーログ

mbp:redmine_my_plugin sioaji$ docker-compose build

WARNING: The REDMINE_VERSION variable is not set. Defaulting to a blank string.

 

Building web

Step 4/16 : RUN rm /bin/sh && ln -s /bin/bash /bin/sh && echo "REDMINE_VERSION: ${REDMINE_VERSION}"

 ---> Running in 9d26600cc70c

REDMINE_VERSION: :-3.4-stable

Removing intermediate container 9d26600cc70c

 ---> 1631495b43da

を見ると、

 

The REDMINE_VERSION variable is not set. Defaulting to a blank string.

 

つまり、

REDMINE_VERSION』は、セットされていないので、デフォルトの空文字になる。

 

と言っていて、

 

また、

echo "REDMINE_VERSION: ${REDMINE_VERSION}"

 

の出力が、

REDMINE_VERSION: :-3.4-stable

 

となっている。

 

なので、ここでは、『空文字:-3.4-stable』が表示されているっぽい。

 

ひとまず、バージョンは固定で良いので、

docker-compose.ymlの

REDMINE_VERSION: $REDMINE_VERSION:-3.4-stable

REDMINE_VERSION: 3.4-stable

に変更してみる。

(さっき修正したDockerファイルは元に戻しておく)

これで、ビルドとRedmine起動 OK になった。

 

----------------------------------------

今日は、ここまで。

次回は、引数でバージョンを切り替える様に出来るか検討しよう。

 

やっぱり、Dockerの使い方を勉強してからでないと厳しそうですが、

ひとまず、動いたらそのまま後回しにしちゃいそう。。。

----------------------------------------

 

※ビルドが成功した時のログ:

mbp:redmine_my_plugin sioaji$ vi docker-compose.yml 

mbp:redmine_my_plugin sioaji$ docker-compose build

Building web

Step 1/16 : FROM ruby:2.4.2

 ---> 2a867526d472

Step 2/16 : LABEL maintainer="AKIKO TAKANO / (Twitter: @akiko_pusu)"   description="Image to run Redmine simply with sqlite to try/review plugin."

 ---> Using cache

 ---> 884cc8d12364

Step 3/16 : ARG REDMINE_VERSION=3.4-stable

 ---> Using cache

 ---> 4006a4d4df42

Step 4/16 : RUN rm /bin/sh && ln -s /bin/bash /bin/sh && echo "REDMINE_VERSION: ${REDMINE_VERSION}"

 ---> Running in c5d4be67da64

REDMINE_VERSION: 3.4-stable

Removing intermediate container c5d4be67da64

 ---> f6c742669281

Step 5/16 : RUN apt-get update

 ---> Running in f6ccb5548563

Get:1 http://security.debian.org jessie/updates InRelease [94.4 kB]

Ign http://deb.debian.org jessie InRelease

Get:2 http://security.debian.org jessie/updates/main amd64 Packages [644 kB]

Get:3 http://deb.debian.org jessie-updates InRelease [145 kB]

Get:4 http://deb.debian.org jessie Release.gpg [2434 B]

Get:5 http://deb.debian.org jessie Release [148 kB]

Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [23.1 kB]

Get:7 http://deb.debian.org jessie/main amd64 Packages [9064 kB]

Fetched 10.1 MB in 11s (887 kB/s)

Reading package lists...

Removing intermediate container f6ccb5548563

 ---> d1eddb802577

Step 6/16 : RUN apt-get install -qq -y     git vim                sqlite3

 ---> Running in afe4841ed630

debconf: delaying package configuration, since apt-utils is not installed

Selecting previously unselected package libgpm2:amd64.

(Reading database ... 21202 files and directories currently installed.)

Preparing to unpack .../libgpm2_1.20.4-6.1+b2_amd64.deb ...

Unpacking libgpm2:amd64 (1.20.4-6.1+b2) ...

Selecting previously unselected package vim-common.

Preparing to unpack .../vim-common_2%3a7.4.488-7+deb8u3_amd64.deb ...

Unpacking vim-common (2:7.4.488-7+deb8u3) ...

Selecting previously unselected package sqlite3.

Preparing to unpack .../sqlite3_3.8.7.1-1+deb8u2_amd64.deb ...

Unpacking sqlite3 (3.8.7.1-1+deb8u2) ...

Selecting previously unselected package vim-runtime.

Preparing to unpack .../vim-runtime_2%3a7.4.488-7+deb8u3_all.deb ...

Adding 'diversion of /usr/share/vim/vim74/doc/help.txt to /usr/share/vim/vim74/doc/help.txt.vim-tiny by vim-runtime'

Adding 'diversion of /usr/share/vim/vim74/doc/tags to /usr/share/vim/vim74/doc/tags.vim-tiny by vim-runtime'

Unpacking vim-runtime (2:7.4.488-7+deb8u3) ...

Selecting previously unselected package vim.

Preparing to unpack .../vim_2%3a7.4.488-7+deb8u3_amd64.deb ...

Unpacking vim (2:7.4.488-7+deb8u3) ...

Processing triggers for mime-support (3.58) ...

Processing triggers for hicolor-icon-theme (0.13-1) ...

Setting up libgpm2:amd64 (1.20.4-6.1+b2) ...

Setting up vim-common (2:7.4.488-7+deb8u3) ...

Setting up sqlite3 (3.8.7.1-1+deb8u2) ...

Setting up vim-runtime (2:7.4.488-7+deb8u3) ...

Processing /usr/share/vim/addons/doc

Setting up vim (2:7.4.488-7+deb8u3) ...

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vim (vim) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vimdiff (vimdiff) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rvim (rvim) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rview (rview) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vi (vi) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/view (view) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/ex (ex) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in auto mode

Processing triggers for libc-bin (2.19-18+deb8u10) ...

Removing intermediate container afe4841ed630

 ---> 8d8db6588ddb

Step 7/16 : RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine

 ---> Running in 20e3e6c5480d

Cloning into 'redmine'...

Removing intermediate container 20e3e6c5480d

 ---> 8f53f096f8d1

Step 8/16 : RUN echo "REDMINE_VERSION: ${REDMINE_VERSION}"

 ---> Running in 622892b3f880

REDMINE_VERSION: 3.4-stable

Removing intermediate container 622892b3f880

 ---> d2950b1b8cc3

Step 9/16 : WORKDIR /tmp/redmine

Removing intermediate container 51c47f09f0d2

 ---> 93433bd992ea

Step 10/16 : RUN echo $'test:\n  adapter: sqlite3\n  database: /tmp/data/redmine_test.sqlite3\n  encoding: utf8mb4\n\ndevelopment:\n  adapter: sqlite3\n  database: /tmp/data/redmine_development.sqlite3\n  encoding: utf8mb4\n'>> config/database.yml

 ---> Running in e65c362006d0

Removing intermediate container e65c362006d0

 ---> 5fa16ad5e204

Step 11/16 : RUN gem update bundler

 ---> Running in 83e1dcc0ae6e

Updating installed gems

Updating bundler

Successfully installed bundler-1.16.1

Gems updated: bundler

Removing intermediate container 83e1dcc0ae6e

 ---> 1fd850a70ec6

Step 12/16 : RUN bundle install --without mysql postgresql rmagick test

 ---> Running in 39cff73fe116

The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x64-mingw32, x86-mswin32. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x64-mingw32 x86-mswin32`.

Fetching gem metadata from https://rubygems.org/..........

Fetching gem metadata from https://rubygems.org/.

Resolving dependencies....

Fetching rake 12.3.1

Installing rake 12.3.1

Fetching i18n 0.7.0

Installing i18n 0.7.0

Fetching minitest 5.11.3

Installing minitest 5.11.3

Fetching thread_safe 0.3.6

Installing thread_safe 0.3.6

Fetching tzinfo 1.2.5

Installing tzinfo 1.2.5

Fetching activesupport 4.2.8

Installing activesupport 4.2.8

Fetching builder 3.2.3

Installing builder 3.2.3

Fetching erubis 2.7.0

Installing erubis 2.7.0

Fetching mini_portile2 2.3.0

Installing mini_portile2 2.3.0

Fetching nokogiri 1.8.2

Installing nokogiri 1.8.2 with native extensions

Fetching rails-deprecated_sanitizer 1.0.3

Installing rails-deprecated_sanitizer 1.0.3

Fetching rails-dom-testing 1.0.9

Installing rails-dom-testing 1.0.9

Fetching crass 1.0.4

Installing crass 1.0.4

Fetching loofah 2.2.2

Installing loofah 2.2.2

Fetching rails-html-sanitizer 1.0.4

Installing rails-html-sanitizer 1.0.4

Fetching actionview 4.2.8

Installing actionview 4.2.8

Fetching rack 1.6.9

Installing rack 1.6.9

Fetching rack-test 0.6.3

Installing rack-test 0.6.3

Fetching actionpack 4.2.8

Installing actionpack 4.2.8

Fetching globalid 0.4.1

Installing globalid 0.4.1

Fetching activejob 4.2.8

Installing activejob 4.2.8

Fetching mime-types-data 3.2016.0521

Installing mime-types-data 3.2016.0521

Fetching mime-types 3.1

Installing mime-types 3.1

Fetching mail 2.6.6

Installing mail 2.6.6

Fetching actionmailer 4.2.8

Installing actionmailer 4.2.8

Fetching actionpack-xml_parser 1.0.2

Installing actionpack-xml_parser 1.0.2

Fetching activemodel 4.2.8

Installing activemodel 4.2.8

Fetching arel 6.0.4

Installing arel 6.0.4

Fetching activerecord 4.2.8

Installing activerecord 4.2.8

Fetching public_suffix 3.0.2

Installing public_suffix 3.0.2

Fetching addressable 2.5.2

Installing addressable 2.5.2

Using bundler 1.16.1

Fetching coderay 1.1.2

Installing coderay 1.1.2

Fetching concurrent-ruby 1.0.5

Installing concurrent-ruby 1.0.5

Fetching css_parser 1.6.0

Installing css_parser 1.6.0

Fetching htmlentities 4.3.4

Installing htmlentities 4.3.4

Fetching thor 0.20.0

Installing thor 0.20.0

Fetching railties 4.2.8

Installing railties 4.2.8

Fetching jquery-rails 3.1.4

Installing jquery-rails 3.1.4

Fetching mimemagic 0.3.2

Installing mimemagic 0.3.2

Fetching net-ldap 0.12.1

Installing net-ldap 0.12.1

Fetching protected_attributes 1.1.4

Installing protected_attributes 1.1.4

Fetching ruby-openid 2.3.0

Installing ruby-openid 2.3.0

Fetching rack-openid 1.4.2

Installing rack-openid 1.4.2

Fetching sprockets 3.7.1

Installing sprockets 3.7.1

Fetching sprockets-rails 3.2.1

Installing sprockets-rails 3.2.1

Fetching rails 4.2.8

Installing rails 4.2.8

Fetching rbpdf-font 1.19.1

Installing rbpdf-font 1.19.1

Fetching rbpdf 1.19.3

Installing rbpdf 1.19.3

Fetching rdoc 4.3.0

Installing rdoc 4.3.0

Fetching redcarpet 3.4.0

Installing redcarpet 3.4.0 with native extensions

Fetching request_store 1.0.5

Installing request_store 1.0.5

Fetching roadie 3.2.2

Installing roadie 3.2.2

Fetching roadie-rails 1.1.1

Installing roadie-rails 1.1.1

Fetching sqlite3 1.3.13

Installing sqlite3 1.3.13 with native extensions

Fetching yard 0.9.12

Installing yard 0.9.12

Bundle complete! 31 Gemfile dependencies, 56 gems now installed.

Gems in the groups mysql, postgresql, rmagick and test were not installed.

Bundled gems are installed into `/usr/local/bundle`

Post-install message from yard:

--------------------------------------------------------------------------------

As of YARD v0.9.2:

 

RubyGems "--document=yri,yard" hooks are now supported. You can auto-configure

YARD to automatically build the yri index for installed gems by typing:

 

    $ yard config --gem-install-yri

 

See `yard config --help` for more information on RubyGems install hooks.

 

You can also add the following to your .gemspec to have YARD document your gem

on install:

 

    spec.metadata["yard.run"] = "yri" # use "yard" to build full HTML docs.

 

--------------------------------------------------------------------------------

Removing intermediate container 39cff73fe116

 ---> e66e554812eb

Step 13/16 : RUN bundle exec rake db:migrate

 ---> Running in 5269974f0c1e

== 1 Setup: migrating =========================================================

-- create_table("attachments", {:force=>true})

   -> 0.0012s

-- create_table("auth_sources", {:force=>true})

   -> 0.0006s

-- create_table("custom_fields", {:force=>true})

   -> 0.0006s

-- create_table("custom_fields_projects", {:id=>false, :force=>true})

   -> 0.0004s

-- create_table("custom_fields_trackers", {:id=>false, :force=>true})

   -> 0.0003s

-- create_table("custom_values", {:force=>true})

   -> 0.0006s

-- create_table("documents", {:force=>true})

   -> 0.0004s

-- add_index("documents", ["project_id"], {:name=>"documents_project_id"})

   -> 0.0004s

-- create_table("enumerations", {:force=>true})

   -> 0.0007s

-- create_table("issue_categories", {:force=>true})

   -> 0.0004s

-- add_index("issue_categories", ["project_id"], {:name=>"issue_categories_project_id"})

   -> 0.0005s

-- create_table("issue_histories", {:force=>true})

   -> 0.0004s

-- add_index("issue_histories", ["issue_id"], {:name=>"issue_histories_issue_id"})

   -> 0.0005s

-- create_table("issue_statuses", {:force=>true})

   -> 0.0005s

-- create_table("issues", {:force=>true})

   -> 0.0007s

-- add_index("issues", ["project_id"], {:name=>"issues_project_id"})

   -> 0.0006s

-- create_table("members", {:force=>true})

   -> 0.0004s

-- create_table("news", {:force=>true})

   -> 0.0007s

-- add_index("news", ["project_id"], {:name=>"news_project_id"})

   -> 0.0003s

-- create_table("permissions", {:force=>true})

   -> 0.0007s

-- create_table("permissions_roles", {:id=>false, :force=>true})

   -> 0.0004s

-- add_index("permissions_roles", ["role_id"], {:name=>"permissions_roles_role_id"})

   -> 0.0005s

-- create_table("projects", {:force=>true})

   -> 0.0007s

-- create_table("roles", {:force=>true})

   -> 0.0004s

-- create_table("tokens", {:force=>true})

   -> 0.0007s

-- create_table("trackers", {:force=>true})

   -> 0.0004s

-- create_table("users", {:force=>true})

   -> 0.0008s

-- create_table("versions", {:force=>true})

   -> 0.0005s

-- add_index("versions", ["project_id"], {:name=>"versions_project_id"})

   -> 0.0005s

-- create_table("workflows", {:force=>true})

   -> 0.0005s

== 1 Setup: migrated (0.0668s) ================================================

 

== 2 IssueMove: migrating =====================================================

== 2 IssueMove: migrated (0.0056s) ============================================

 

== 3 IssueAddNote: migrating ==================================================

== 3 IssueAddNote: migrated (0.0057s) =========================================

 

== 4 ExportPdf: migrating =====================================================

== 4 ExportPdf: migrated (0.0148s) ============================================

 

== 5 IssueStartDate: migrating ================================================

-- add_column(:issues, :start_date, :date)

   -> 0.0004s

-- add_column(:issues, :done_ratio, :integer, {:default=>0, :null=>false})

   -> 0.0004s

== 5 IssueStartDate: migrated (0.0009s) =======================================

 

== 6 CalendarAndActivity: migrating ===========================================

== 6 CalendarAndActivity: migrated (0.0054s) ==================================

 

== 7 CreateJournals: migrating ================================================

-- create_table(:journals, {:force=>true})

   -> 0.0013s

-- create_table(:journal_details, {:force=>true})

   -> 0.0005s

-- add_index("journals", ["journalized_id", "journalized_type"], {:name=>"journals_journalized_id"})

   -> 0.0004s

-- add_index("journal_details", ["journal_id"], {:name=>"journal_details_journal_id"})

   -> 0.0004s

-- drop_table(:issue_histories)

   -> 0.0012s

== 7 CreateJournals: migrated (0.0088s) =======================================

 

== 8 CreateUserPreferences: migrating =========================================

-- create_table(:user_preferences)

   -> 0.0005s

== 8 CreateUserPreferences: migrated (0.0006s) ================================

 

== 9 AddHideMailPref: migrating ===============================================

-- add_column(:user_preferences, :hide_mail, :boolean, {:default=>false})

   -> 0.0004s

== 9 AddHideMailPref: migrated (0.0005s) ======================================

 

== 10 CreateComments: migrating ===============================================

-- create_table(:comments)

   -> 0.0006s

== 10 CreateComments: migrated (0.0006s) ======================================

 

== 11 AddNewsCommentsCount: migrating =========================================

-- add_column(:news, :comments_count, :integer, {:default=>0, :null=>false})

   -> 0.0004s

== 11 AddNewsCommentsCount: migrated (0.0005s) ================================

 

== 12 AddCommentsPermissions: migrating =======================================

== 12 AddCommentsPermissions: migrated (0.0045s) ==============================

 

== 13 CreateQueries: migrating ================================================

-- create_table(:queries, {:force=>true})

   -> 0.0007s

== 13 CreateQueries: migrated (0.0008s) =======================================

 

== 14 AddQueriesPermissions: migrating ========================================

== 14 AddQueriesPermissions: migrated (0.0039s) ===============================

 

== 15 CreateRepositories: migrating ===========================================

-- create_table(:repositories, {:force=>true})

   -> 0.0006s

== 15 CreateRepositories: migrated (0.0007s) ==================================

 

== 16 AddRepositoriesPermissions: migrating ===================================

== 16 AddRepositoriesPermissions: migrated (0.0060s) ==========================

 

== 17 CreateSettings: migrating ===============================================

-- create_table(:settings, {:force=>true})

   -> 0.0005s

== 17 CreateSettings: migrated (0.0006s) ======================================

 

== 18 SetDocAndFilesNotifications: migrating ==================================

== 18 SetDocAndFilesNotifications: migrated (0.0078s) =========================

 

== 19 AddIssueStatusPosition: migrating =======================================

-- add_column(:issue_statuses, :position, :integer, {:default=>1})

   -> 0.0004s

== 19 AddIssueStatusPosition: migrated (0.0048s) ==============================

 

== 20 AddRolePosition: migrating ==============================================

-- add_column(:roles, :position, :integer, {:default=>1})

   -> 0.0004s

== 20 AddRolePosition: migrated (0.0093s) =====================================

 

== 21 AddTrackerPosition: migrating ===========================================

-- add_column(:trackers, :position, :integer, {:default=>1})

   -> 0.0004s

== 21 AddTrackerPosition: migrated (0.0085s) ==================================

 

== 22 SerializePossiblesValues: migrating =====================================

== 22 SerializePossiblesValues: migrated (0.0007s) ============================

 

== 23 AddTrackerIsInRoadmap: migrating ========================================

-- add_column(:trackers, :is_in_roadmap, :boolean, {:default=>true, :null=>false})

   -> 0.0004s

== 23 AddTrackerIsInRoadmap: migrated (0.0005s) ===============================

 

== 24 AddRoadmapPermission: migrating =========================================

== 24 AddRoadmapPermission: migrated (0.0038s) ================================

 

== 25 AddSearchPermission: migrating ==========================================

== 25 AddSearchPermission: migrated (0.0040s) =================================

 

== 26 AddRepositoryLoginAndPassword: migrating ================================

-- add_column(:repositories, :login, :string, {:limit=>60, :default=>""})

   -> 0.0004s

-- add_column(:repositories, :password, :string, {:limit=>60, :default=>""})

   -> 0.0003s

== 26 AddRepositoryLoginAndPassword: migrated (0.0008s) =======================

 

== 27 CreateWikis: migrating ==================================================

-- create_table(:wikis)

   -> 0.0005s

-- add_index(:wikis, :project_id, {:name=>:wikis_project_id})

   -> 0.0004s

== 27 CreateWikis: migrated (0.0009s) =========================================

 

== 28 CreateWikiPages: migrating ==============================================

-- create_table(:wiki_pages)

   -> 0.0005s

-- add_index(:wiki_pages, [:wiki_id, :title], {:name=>:wiki_pages_wiki_id_title})

   -> 0.0008s

== 28 CreateWikiPages: migrated (0.0014s) =====================================

 

== 29 CreateWikiContents: migrating ===========================================

-- create_table(:wiki_contents)

   -> 0.0006s

-- add_index(:wiki_contents, :page_id, {:name=>:wiki_contents_page_id})

   -> 0.0004s

-- create_table(:wiki_content_versions)

   -> 0.0004s

-- add_index(:wiki_content_versions, :wiki_content_id, {:name=>:wiki_content_versions_wcid})

   -> 0.0004s

== 29 CreateWikiContents: migrated (0.0018s) ==================================

 

== 30 AddProjectsFeedsPermissions: migrating ==================================

== 30 AddProjectsFeedsPermissions: migrated (0.0039s) =========================

 

== 31 AddRepositoryRootUrl: migrating =========================================

-- add_column(:repositories, :root_url, :string, {:limit=>255, :default=>""})

   -> 0.0004s

== 31 AddRepositoryRootUrl: migrated (0.0005s) ================================

 

== 32 CreateTimeEntries: migrating ============================================

-- create_table(:time_entries)

   -> 0.0005s

-- add_index(:time_entries, [:project_id], {:name=>:time_entries_project_id})

   -> 0.0004s

-- add_index(:time_entries, [:issue_id], {:name=>:time_entries_issue_id})

   -> 0.0005s

== 32 CreateTimeEntries: migrated (0.0015s) ===================================

 

== 33 AddTimelogPermissions: migrating ========================================

== 33 AddTimelogPermissions: migrated (0.0045s) ===============================

 

== 34 CreateChangesets: migrating =============================================

-- create_table(:changesets)

   -> 0.0006s

-- add_index(:changesets, [:repository_id, :revision], {:unique=>true, :name=>:changesets_repos_rev})

   -> 0.0005s

== 34 CreateChangesets: migrated (0.0012s) ====================================

 

== 35 CreateChanges: migrating ================================================

-- create_table(:changes)

   -> 0.0006s

-- add_index(:changes, [:changeset_id], {:name=>:changesets_changeset_id})

   -> 0.0004s

== 35 CreateChanges: migrated (0.0011s) =======================================

 

== 36 AddChangesetCommitDate: migrating =======================================

-- add_column(:changesets, :commit_date, :date)

   -> 0.0005s

== 36 AddChangesetCommitDate: migrated (0.0200s) ==============================

 

== 37 AddProjectIdentifier: migrating =========================================

-- add_column(:projects, :identifier, :string, {:limit=>20})

   -> 0.0004s

== 37 AddProjectIdentifier: migrated (0.0005s) ================================

 

== 38 AddCustomFieldIsFilter: migrating =======================================

-- add_column(:custom_fields, :is_filter, :boolean, {:null=>false, :default=>false})

   -> 0.0004s

== 38 AddCustomFieldIsFilter: migrated (0.0005s) ==============================

 

== 39 CreateWatchers: migrating ===============================================

-- create_table(:watchers)

   -> 0.0005s

== 39 CreateWatchers: migrated (0.0005s) ======================================

 

== 40 CreateChangesetsIssues: migrating =======================================

-- create_table(:changesets_issues, {:id=>false})

   -> 0.0004s

-- add_index(:changesets_issues, [:changeset_id, :issue_id], {:unique=>true, :name=>:changesets_issues_ids})

   -> 0.0005s

== 40 CreateChangesetsIssues: migrated (0.0010s) ==============================

 

== 41 RenameCommentToComments: migrating ======================================

== 41 RenameCommentToComments: migrated (0.0666s) =============================

 

== 42 CreateIssueRelations: migrating =========================================

-- create_table(:issue_relations)

   -> 0.0005s

== 42 CreateIssueRelations: migrated (0.0005s) ================================

 

== 43 AddRelationsPermissions: migrating ======================================

== 43 AddRelationsPermissions: migrated (0.0041s) =============================

 

== 44 SetLanguageLengthToFive: migrating ======================================

-- change_column(:users, :language, :string, {:limit=>5, :default=>""})

   -> 0.0040s

== 44 SetLanguageLengthToFive: migrated (0.0041s) =============================

 

== 45 CreateBoards: migrating =================================================

-- create_table(:boards)

   -> 0.0006s

-- add_index(:boards, [:project_id], {:name=>:boards_project_id})

   -> 0.0004s

== 45 CreateBoards: migrated (0.0011s) ========================================

 

== 46 CreateMessages: migrating ===============================================

-- create_table(:messages)

   -> 0.0006s

-- add_index(:messages, [:board_id], {:name=>:messages_board_id})

   -> 0.0004s

-- add_index(:messages, [:parent_id], {:name=>:messages_parent_id})

   -> 0.0006s

== 46 CreateMessages: migrated (0.0017s) ======================================

 

== 47 AddBoardsPermissions: migrating =========================================

== 47 AddBoardsPermissions: migrated (0.0052s) ================================

 

== 48 AllowNullVersionEffectiveDate: migrating ================================

-- change_column(:versions, :effective_date, :date, {:default=>nil, :null=>true})

   -> 0.0041s

== 48 AllowNullVersionEffectiveDate: migrated (0.0041s) =======================

 

== 49 AddWikiDestroyPagePermission: migrating =================================

== 49 AddWikiDestroyPagePermission: migrated (0.0037s) ========================

 

== 50 AddWikiAttachmentsPermissions: migrating ================================

== 50 AddWikiAttachmentsPermissions: migrated (0.0042s) =======================

 

== 51 AddProjectStatus: migrating =============================================

-- add_column(:projects, :status, :integer, {:default=>1, :null=>false})

   -> 0.0004s

== 51 AddProjectStatus: migrated (0.0005s) ====================================

 

== 52 AddChangesRevision: migrating ===========================================

-- add_column(:changes, :revision, :string)

   -> 0.0004s

== 52 AddChangesRevision: migrated (0.0004s) ==================================

 

== 53 AddChangesBranch: migrating =============================================

-- add_column(:changes, :branch, :string)

   -> 0.0004s

== 53 AddChangesBranch: migrated (0.0005s) ====================================

 

== 54 AddChangesetsScmid: migrating ===========================================

-- add_column(:changesets, :scmid, :string)

   -> 0.0004s

== 54 AddChangesetsScmid: migrated (0.0005s) ==================================

 

== 55 AddRepositoriesType: migrating ==========================================

-- add_column(:repositories, :type, :string)

   -> 0.0004s

== 55 AddRepositoriesType: migrated (0.0008s) =================================

 

== 56 AddRepositoriesChangesPermission: migrating =============================

== 56 AddRepositoriesChangesPermission: migrated (0.0041s) ====================

 

== 57 AddVersionsWikiPageTitle: migrating =====================================

-- add_column(:versions, :wiki_page_title, :string)

   -> 0.0005s

== 57 AddVersionsWikiPageTitle: migrated (0.0005s) ============================

 

== 58 AddIssueCategoriesAssignedToId: migrating ===============================

-- add_column(:issue_categories, :assigned_to_id, :integer)

   -> 0.0004s

== 58 AddIssueCategoriesAssignedToId: migrated (0.0005s) ======================

 

== 59 AddRolesAssignable: migrating ===========================================

-- add_column(:roles, :assignable, :boolean, {:default=>true})

   -> 0.0005s

== 59 AddRolesAssignable: migrated (0.0006s) ==================================

 

== 60 ChangeChangesetsCommitterLimit: migrating ===============================

-- change_column(:changesets, :committer, :string, {:limit=>nil})

   -> 0.0043s

== 60 ChangeChangesetsCommitterLimit: migrated (0.0043s) ======================

 

== 61 AddRolesBuiltin: migrating ==============================================

-- add_column(:roles, :builtin, :integer, {:default=>0, :null=>false})

   -> 0.0005s

== 61 AddRolesBuiltin: migrated (0.0005s) =====================================

 

== 62 InsertBuiltinRoles: migrating ===========================================

== 62 InsertBuiltinRoles: migrated (0.0316s) ==================================

 

== 63 AddRolesPermissions: migrating ==========================================

-- add_column(:roles, :permissions, :text)

   -> 0.0005s

== 63 AddRolesPermissions: migrated (0.0006s) =================================

 

== 64 DropPermissions: migrating ==============================================

-- drop_table(:permissions)

   -> 0.0003s

-- drop_table(:permissions_roles)

   -> 0.0002s

== 64 DropPermissions: migrated (0.0007s) =====================================

 

== 65 AddSettingsUpdatedOn: migrating =========================================

-- add_column(:settings, :updated_on, :timestamp)

   -> 0.0004s

== 65 AddSettingsUpdatedOn: migrated (0.0120s) ================================

 

== 66 AddCustomValueCustomizedIndex: migrating ================================

-- add_index(:custom_values, [:customized_type, :customized_id], {:name=>:custom_values_customized})

   -> 0.0006s

== 66 AddCustomValueCustomizedIndex: migrated (0.0006s) =======================

 

== 67 CreateWikiRedirects: migrating ==========================================

-- create_table(:wiki_redirects)

   -> 0.0005s

-- add_index(:wiki_redirects, [:wiki_id, :title], {:name=>:wiki_redirects_wiki_id_title})

   -> 0.0005s

== 67 CreateWikiRedirects: migrated (0.0010s) =================================

 

== 68 CreateEnabledModules: migrating =========================================

-- create_table(:enabled_modules)

   -> 0.0005s

-- add_index(:enabled_modules, [:project_id], {:name=>:enabled_modules_project_id})

   -> 0.0004s

== 68 CreateEnabledModules: migrated (0.0018s) ================================

 

== 69 AddIssuesEstimatedHours: migrating ======================================

-- add_column(:issues, :estimated_hours, :float)

   -> 0.0005s

== 69 AddIssuesEstimatedHours: migrated (0.0005s) =============================

 

== 70 ChangeAttachmentsContentTypeLimit: migrating ============================

-- change_column(:attachments, :content_type, :string, {:limit=>nil})

   -> 0.0034s

== 70 ChangeAttachmentsContentTypeLimit: migrated (0.0035s) ===================

 

== 71 AddQueriesColumnNames: migrating ========================================

-- add_column(:queries, :column_names, :text)

   -> 0.0005s

== 71 AddQueriesColumnNames: migrated (0.0005s) ===============================

 

== 72 AddEnumerationsPosition: migrating ======================================

-- add_column(:enumerations, :position, :integer, {:default=>1})

   -> 0.0005s

== 72 AddEnumerationsPosition: migrated (0.0146s) =============================

 

== 73 AddEnumerationsIsDefault: migrating =====================================

-- add_column(:enumerations, :is_default, :boolean, {:default=>false, :null=>false})

   -> 0.0004s

== 73 AddEnumerationsIsDefault: migrated (0.0005s) ============================

 

== 74 AddAuthSourcesTls: migrating ============================================

-- add_column(:auth_sources, :tls, :boolean, {:default=>false, :null=>false})

   -> 0.0004s

== 74 AddAuthSourcesTls: migrated (0.0005s) ===================================

 

== 75 AddMembersMailNotification: migrating ===================================

-- add_column(:members, :mail_notification, :boolean, {:default=>false, :null=>false})

   -> 0.0004s

== 75 AddMembersMailNotification: migrated (0.0004s) ==========================

 

== 76 AllowNullPosition: migrating ============================================

-- change_column(:issue_statuses, :position, :integer, {:default=>1, :null=>true})

   -> 0.0028s

-- change_column(:roles, :position, :integer, {:default=>1, :null=>true})

   -> 0.0030s

-- change_column(:trackers, :position, :integer, {:default=>1, :null=>true})

   -> 0.0024s

-- change_column(:boards, :position, :integer, {:default=>1, :null=>true})

   -> 0.0039s

-- change_column(:enumerations, :position, :integer, {:default=>1, :null=>true})

   -> 0.0022s

== 76 AllowNullPosition: migrated (0.0146s) ===================================

 

== 77 RemoveIssueStatusesHtmlColor: migrating =================================

-- remove_column(:issue_statuses, :html_color)

   -> 0.0031s

== 77 RemoveIssueStatusesHtmlColor: migrated (0.0032s) ========================

 

== 78 AddCustomFieldsPosition: migrating ======================================

-- add_column(:custom_fields, :position, :integer, {:default=>1})

   -> 0.0005s

== 78 AddCustomFieldsPosition: migrated (0.0009s) =============================

 

== 79 AddUserPreferencesTimeZone: migrating ===================================

-- add_column(:user_preferences, :time_zone, :string)

   -> 0.0004s

== 79 AddUserPreferencesTimeZone: migrated (0.0005s) ==========================

 

== 80 AddUsersType: migrating =================================================

-- add_column(:users, :type, :string)

   -> 0.0005s

== 80 AddUsersType: migrated (0.0292s) ========================================

 

== 81 CreateProjectsTrackers: migrating =======================================

-- create_table(:projects_trackers, {:id=>false})

   -> 0.0005s

-- add_index(:projects_trackers, :project_id, {:name=>:projects_trackers_project_id})

   -> 0.0004s

== 81 CreateProjectsTrackers: migrated (0.0091s) ==============================

 

== 82 AddMessagesLocked: migrating ============================================

-- add_column(:messages, :locked, :boolean, {:default=>false})

   -> 0.0005s

== 82 AddMessagesLocked: migrated (0.0006s) ===================================

 

== 83 AddMessagesSticky: migrating ============================================

-- add_column(:messages, :sticky, :integer, {:default=>0})

   -> 0.0005s

== 83 AddMessagesSticky: migrated (0.0005s) ===================================

 

== 84 ChangeAuthSourcesAccountLimit: migrating ================================

-- change_column(:auth_sources, :account, :string, {:limit=>nil})

   -> 0.0034s

== 84 ChangeAuthSourcesAccountLimit: migrated (0.0034s) =======================

 

== 85 AddRoleTrackerOldStatusIndexToWorkflows: migrating ======================

-- add_index(:workflows, [:role_id, :tracker_id, :old_status_id], {:name=>:wkfs_role_tracker_old_status})

   -> 0.0006s

== 85 AddRoleTrackerOldStatusIndexToWorkflows: migrated (0.0006s) =============

 

== 86 AddCustomFieldsSearchable: migrating ====================================

-- add_column(:custom_fields, :searchable, :boolean, {:default=>false})

   -> 0.0004s

== 86 AddCustomFieldsSearchable: migrated (0.0005s) ===========================

 

== 87 ChangeProjectsDescriptionToText: migrating ==============================

-- change_column(:projects, :description, :text, {:null=>true, :default=>nil})

   -> 0.0031s

== 87 ChangeProjectsDescriptionToText: migrated (0.0031s) =====================

 

== 88 AddCustomFieldsDefaultValue: migrating ==================================

-- add_column(:custom_fields, :default_value, :text)

   -> 0.0005s

== 88 AddCustomFieldsDefaultValue: migrated (0.0005s) =========================

 

== 89 AddAttachmentsDescription: migrating ====================================

-- add_column(:attachments, :description, :string)

   -> 0.0004s

== 89 AddAttachmentsDescription: migrated (0.0004s) ===========================

 

== 90 ChangeVersionsNameLimit: migrating ======================================

-- change_column(:versions, :name, :string, {:limit=>nil})

   -> 0.0046s

== 90 ChangeVersionsNameLimit: migrated (0.0046s) =============================

 

== 91 ChangeChangesetsRevisionToString: migrating =============================

-- index_exists?(:changesets, [:repository_id, :revision], {:name=>:changesets_repos_rev})

   -> 0.0004s

-- remove_index(:changesets, {:name=>:changesets_repos_rev})

   -> 0.0005s

-- index_exists?(:changesets, [:repository_id, :revision], {:name=>:altered_changesets_repos_rev})

   -> 0.0001s

-- change_column(:changesets, :revision, :string, {:null=>false})

   -> 0.0025s

-- add_index(:changesets, [:repository_id, :revision], {:unique=>true, :name=>:changesets_repos_rev})

   -> 0.0004s

== 91 ChangeChangesetsRevisionToString: migrated (0.0041s) ====================

 

== 92 ChangeChangesFromRevisionToString: migrating ============================

-- change_column(:changes, :from_revision, :string)

   -> 0.0041s

== 92 ChangeChangesFromRevisionToString: migrated (0.0041s) ===================

 

== 93 AddWikiPagesProtected: migrating ========================================

-- add_column(:wiki_pages, :protected, :boolean, {:default=>false, :null=>false})

   -> 0.0005s

== 93 AddWikiPagesProtected: migrated (0.0006s) ===============================

 

== 94 ChangeProjectsHomepageLimit: migrating ==================================

-- change_column(:projects, :homepage, :string, {:limit=>nil, :default=>""})

   -> 0.0030s

== 94 ChangeProjectsHomepageLimit: migrated (0.0031s) =========================

 

== 95 AddWikiPagesParentId: migrating =========================================

-- add_column(:wiki_pages, :parent_id, :integer, {:default=>nil})

   -> 0.0004s

== 95 AddWikiPagesParentId: migrated (0.0005s) ================================

 

== 96 AddCommitAccessPermission: migrating ====================================

== 96 AddCommitAccessPermission: migrated (0.0005s) ===========================

 

== 97 AddViewWikiEditsPermission: migrating ===================================

== 97 AddViewWikiEditsPermission: migrated (0.0005s) ==========================

 

== 98 SetTopicAuthorsAsWatchers: migrating ====================================

== 98 SetTopicAuthorsAsWatchers: migrated (0.0191s) ===========================

 

== 99 AddDeleteWikiPagesAttachmentsPermission: migrating ======================

== 99 AddDeleteWikiPagesAttachmentsPermission: migrated (0.0006s) =============

 

== 100 AddChangesetsUserId: migrating =========================================

-- add_column(:changesets, :user_id, :integer, {:default=>nil})

   -> 0.0004s

== 100 AddChangesetsUserId: migrated (0.0005s) ================================

 

== 101 PopulateChangesetsUserId: migrating ====================================

== 101 PopulateChangesetsUserId: migrated (0.0002s) ===========================

 

== 102 AddCustomFieldsEditable: migrating =====================================

-- add_column(:custom_fields, :editable, :boolean, {:default=>true})

   -> 0.0007s

== 102 AddCustomFieldsEditable: migrated (0.0008s) ============================

 

== 103 SetCustomFieldsEditable: migrating =====================================

== 103 SetCustomFieldsEditable: migrated (0.0025s) ============================

 

== 104 AddProjectsLftAndRgt: migrating ========================================

-- add_column(:projects, :lft, :integer)

   -> 0.0004s

-- add_column(:projects, :rgt, :integer)

   -> 0.0003s

== 104 AddProjectsLftAndRgt: migrated (0.0008s) ===============================

 

== 105 BuildProjectsTree: migrating ===========================================

== 105 BuildProjectsTree: migrated (0.0014s) ==================================

 

== 106 RemoveProjectsProjectsCount: migrating =================================

-- remove_column(:projects, :projects_count)

   -> 0.0037s

== 106 RemoveProjectsProjectsCount: migrated (0.0037s) ========================

 

== 107 AddOpenIdAuthenticationTables: migrating ===============================

-- create_table(:open_id_authentication_associations, {:force=>true})

   -> 0.0007s

-- create_table(:open_id_authentication_nonces, {:force=>true})

   -> 0.0005s

== 107 AddOpenIdAuthenticationTables: migrated (0.0012s) ======================

 

== 108 AddIdentityUrlToUsers: migrating =======================================

-- add_column(:users, :identity_url, :string)

   -> 0.0004s

== 108 AddIdentityUrlToUsers: migrated (0.0005s) ==============================

 

== 20090214190337 AddWatchersUserIdTypeIndex: migrating =======================

-- add_index(:watchers, [:user_id, :watchable_type], {:name=>:watchers_user_id_type})

   -> 0.0006s

== 20090214190337 AddWatchersUserIdTypeIndex: migrated (0.0006s) ==============

 

== 20090312172426 AddQueriesSortCriteria: migrating ===========================

-- add_column(:queries, :sort_criteria, :text)

   -> 0.0004s

== 20090312172426 AddQueriesSortCriteria: migrated (0.0004s) ==================

 

== 20090312194159 AddProjectsTrackersUniqueIndex: migrating ===================

-- add_index(:projects_trackers, [:project_id, :tracker_id], {:name=>:projects_trackers_unique, :unique=>true})

   -> 0.0007s

== 20090312194159 AddProjectsTrackersUniqueIndex: migrated (0.0012s) ==========

 

== 20090318181151 ExtendSettingsName: migrating ===============================

-- change_column(:settings, :name, :string, {:limit=>255, :default=>"", :null=>false})

   -> 0.0026s

== 20090318181151 ExtendSettingsName: migrated (0.0026s) ======================

 

== 20090323224724 AddTypeToEnumerations: migrating ============================

-- add_column(:enumerations, :type, :string)

   -> 0.0004s

== 20090323224724 AddTypeToEnumerations: migrated (0.0004s) ===================

 

== 20090401221305 UpdateEnumerationsToSti: migrating ==========================

== 20090401221305 UpdateEnumerationsToSti: migrated (0.0013s) =================

 

== 20090401231134 AddActiveFieldToEnumerations: migrating =====================

-- add_column(:enumerations, :active, :boolean, {:default=>true, :null=>false})

   -> 0.0005s

== 20090401231134 AddActiveFieldToEnumerations: migrated (0.0005s) ============

 

== 20090403001910 AddProjectToEnumerations: migrating =========================

-- add_column(:enumerations, :project_id, :integer, {:null=>true, :default=>nil})

   -> 0.0004s

-- add_index(:enumerations, :project_id)

   -> 0.0004s

== 20090403001910 AddProjectToEnumerations: migrated (0.0009s) ================

 

== 20090406161854 AddParentIdToEnumerations: migrating ========================

-- add_column(:enumerations, :parent_id, :integer, {:null=>true, :default=>nil})

   -> 0.0004s

== 20090406161854 AddParentIdToEnumerations: migrated (0.0005s) ===============

 

== 20090425161243 AddQueriesGroupBy: migrating ================================

-- add_column(:queries, :group_by, :string)

   -> 0.0004s

== 20090425161243 AddQueriesGroupBy: migrated (0.0004s) =======================

 

== 20090503121501 CreateMemberRoles: migrating ================================

-- create_table(:member_roles)

   -> 0.0004s

== 20090503121501 CreateMemberRoles: migrated (0.0005s) =======================

 

== 20090503121505 PopulateMemberRoles: migrating ==============================

== 20090503121505 PopulateMemberRoles: migrated (0.0078s) =====================

 

== 20090503121510 DropMembersRoleId: migrating ================================

-- remove_column(:members, :role_id)

   -> 0.0027s

== 20090503121510 DropMembersRoleId: migrated (0.0027s) =======================

 

== 20090614091200 FixMessagesStickyNull: migrating ============================

== 20090614091200 FixMessagesStickyNull: migrated (0.0004s) ===================

 

== 20090704172350 PopulateUsersType: migrating ================================

== 20090704172350 PopulateUsersType: migrated (0.0004s) =======================

 

== 20090704172355 CreateGroupsUsers: migrating ================================

-- create_table(:groups_users, {:id=>false})

   -> 0.0004s

-- add_index(:groups_users, [:group_id, :user_id], {:unique=>true, :name=>:groups_users_ids})

   -> 0.0005s

== 20090704172355 CreateGroupsUsers: migrated (0.0009s) =======================

 

== 20090704172358 AddMemberRolesInheritedFrom: migrating ======================

-- add_column(:member_roles, :inherited_from, :integer)

   -> 0.0004s

== 20090704172358 AddMemberRolesInheritedFrom: migrated (0.0004s) =============

 

== 20091010093521 FixUsersCustomValues: migrating =============================

== 20091010093521 FixUsersCustomValues: migrated (0.0032s) ====================

 

== 20091017212227 AddMissingIndexesToWorkflows: migrating =====================

-- add_index(:workflows, :old_status_id)

   -> 0.0008s

-- add_index(:workflows, :role_id)

   -> 0.0008s

-- add_index(:workflows, :new_status_id)

   -> 0.0011s

== 20091017212227 AddMissingIndexesToWorkflows: migrated (0.0028s) ============

 

== 20091017212457 AddMissingIndexesToCustomFieldsProjects: migrating ==========

-- add_index(:custom_fields_projects, [:custom_field_id, :project_id])

   -> 0.0006s

== 20091017212457 AddMissingIndexesToCustomFieldsProjects: migrated (0.0006s) =

 

== 20091017212644 AddMissingIndexesToMessages: migrating ======================

-- add_index(:messages, :last_reply_id)

   -> 0.0009s

-- add_index(:messages, :author_id)

   -> 0.0010s

== 20091017212644 AddMissingIndexesToMessages: migrated (0.0020s) =============

 

== 20091017212938 AddMissingIndexesToRepositories: migrating ==================

-- add_index(:repositories, :project_id)

   -> 0.0005s

== 20091017212938 AddMissingIndexesToRepositories: migrated (0.0006s) =========

 

== 20091017213027 AddMissingIndexesToComments: migrating ======================

-- add_index(:comments, [:commented_id, :commented_type])

   -> 0.0005s

-- add_index(:comments, :author_id)

   -> 0.0006s

== 20091017213027 AddMissingIndexesToComments: migrated (0.0012s) =============

 

== 20091017213113 AddMissingIndexesToEnumerations: migrating ==================

-- add_index(:enumerations, [:id, :type])

   -> 0.0007s

== 20091017213113 AddMissingIndexesToEnumerations: migrated (0.0008s) =========

 

== 20091017213151 AddMissingIndexesToWikiPages: migrating =====================

-- add_index(:wiki_pages, :wiki_id)

   -> 0.0007s

-- add_index(:wiki_pages, :parent_id)

   -> 0.0008s

== 20091017213151 AddMissingIndexesToWikiPages: migrated (0.0016s) ============

 

== 20091017213228 AddMissingIndexesToWatchers: migrating ======================

-- add_index(:watchers, :user_id)

   -> 0.0007s

-- add_index(:watchers, [:watchable_id, :watchable_type])

   -> 0.0008s

== 20091017213228 AddMissingIndexesToWatchers: migrated (0.0015s) =============

 

== 20091017213257 AddMissingIndexesToAuthSources: migrating ===================

-- add_index(:auth_sources, [:id, :type])

   -> 0.0006s

== 20091017213257 AddMissingIndexesToAuthSources: migrated (0.0006s) ==========

 

== 20091017213332 AddMissingIndexesToDocuments: migrating =====================

-- add_index(:documents, :category_id)

   -> 0.0008s

== 20091017213332 AddMissingIndexesToDocuments: migrated (0.0009s) ============

 

== 20091017213444 AddMissingIndexesToTokens: migrating ========================

-- add_index(:tokens, :user_id)

   -> 0.0007s

== 20091017213444 AddMissingIndexesToTokens: migrated (0.0007s) ===============

 

== 20091017213536 AddMissingIndexesToChangesets: migrating ====================

-- add_index(:changesets, :user_id)

   -> 0.0010s

-- add_index(:changesets, :repository_id)

   -> 0.0011s

== 20091017213536 AddMissingIndexesToChangesets: migrated (0.0022s) ===========

 

== 20091017213642 AddMissingIndexesToIssueCategories: migrating ===============

-- add_index(:issue_categories, :assigned_to_id)

   -> 0.0008s

== 20091017213642 AddMissingIndexesToIssueCategories: migrated (0.0009s) ======

 

== 20091017213716 AddMissingIndexesToMemberRoles: migrating ===================

-- add_index(:member_roles, :member_id)

   -> 0.0005s

-- add_index(:member_roles, :role_id)

   -> 0.0007s

== 20091017213716 AddMissingIndexesToMemberRoles: migrated (0.0013s) ==========

 

== 20091017213757 AddMissingIndexesToBoards: migrating ========================

-- add_index(:boards, :last_message_id)

   -> 0.0008s

== 20091017213757 AddMissingIndexesToBoards: migrated (0.0008s) ===============

 

== 20091017213835 AddMissingIndexesToUserPreferences: migrating ===============

-- add_index(:user_preferences, :user_id)

   -> 0.0006s

== 20091017213835 AddMissingIndexesToUserPreferences: migrated (0.0007s) ======

 

== 20091017213910 AddMissingIndexesToIssues: migrating ========================

-- add_index(:issues, :status_id)

   -> 0.0008s

-- add_index(:issues, :category_id)

   -> 0.0008s

-- add_index(:issues, :assigned_to_id)

   -> 0.0010s

-- add_index(:issues, :fixed_version_id)

   -> 0.0012s

-- add_index(:issues, :tracker_id)

   -> 0.0014s

-- add_index(:issues, :priority_id)

   -> 0.0016s

-- add_index(:issues, :author_id)

   -> 0.0018s

== 20091017213910 AddMissingIndexesToIssues: migrated (0.0088s) ===============

 

== 20091017214015 AddMissingIndexesToMembers: migrating =======================

-- add_index(:members, :user_id)

   -> 0.0006s

-- add_index(:members, :project_id)

   -> 0.0006s

== 20091017214015 AddMissingIndexesToMembers: migrated (0.0013s) ==============

 

== 20091017214107 AddMissingIndexesToCustomFields: migrating ==================

-- add_index(:custom_fields, [:id, :type])

   -> 0.0006s

== 20091017214107 AddMissingIndexesToCustomFields: migrated (0.0006s) =========

 

== 20091017214136 AddMissingIndexesToQueries: migrating =======================

-- add_index(:queries, :project_id)

   -> 0.0005s

-- add_index(:queries, :user_id)

   -> 0.0006s

== 20091017214136 AddMissingIndexesToQueries: migrated (0.0012s) ==============

 

== 20091017214236 AddMissingIndexesToTimeEntries: migrating ===================

-- add_index(:time_entries, :activity_id)

   -> 0.0010s

-- add_index(:time_entries, :user_id)

   -> 0.0010s

== 20091017214236 AddMissingIndexesToTimeEntries: migrated (0.0020s) ==========

 

== 20091017214308 AddMissingIndexesToNews: migrating ==========================

-- add_index(:news, :author_id)

   -> 0.0008s

== 20091017214308 AddMissingIndexesToNews: migrated (0.0008s) =================

 

== 20091017214336 AddMissingIndexesToUsers: migrating =========================

-- add_index(:users, [:id, :type])

   -> 0.0007s

-- add_index(:users, :auth_source_id)

   -> 0.0006s

== 20091017214336 AddMissingIndexesToUsers: migrated (0.0014s) ================

 

== 20091017214406 AddMissingIndexesToAttachments: migrating ===================

-- add_index(:attachments, [:container_id, :container_type])

   -> 0.0005s

-- add_index(:attachments, :author_id)

   -> 0.0006s

== 20091017214406 AddMissingIndexesToAttachments: migrated (0.0012s) ==========

 

== 20091017214440 AddMissingIndexesToWikiContents: migrating ==================

-- add_index(:wiki_contents, :author_id)

   -> 0.0008s

== 20091017214440 AddMissingIndexesToWikiContents: migrated (0.0008s) =========

 

== 20091017214519 AddMissingIndexesToCustomValues: migrating ==================

-- add_index(:custom_values, :custom_field_id)

   -> 0.0007s

== 20091017214519 AddMissingIndexesToCustomValues: migrated (0.0008s) =========

 

== 20091017214611 AddMissingIndexesToJournals: migrating ======================

-- add_index(:journals, :user_id)

   -> 0.0008s

-- add_index(:journals, :journalized_id)

   -> 0.0008s

== 20091017214611 AddMissingIndexesToJournals: migrated (0.0016s) =============

 

== 20091017214644 AddMissingIndexesToIssueRelations: migrating ================

-- add_index(:issue_relations, :issue_from_id)

   -> 0.0005s

-- add_index(:issue_relations, :issue_to_id)

   -> 0.0006s

== 20091017214644 AddMissingIndexesToIssueRelations: migrated (0.0012s) =======

 

== 20091017214720 AddMissingIndexesToWikiRedirects: migrating =================

-- add_index(:wiki_redirects, :wiki_id)

   -> 0.0008s

== 20091017214720 AddMissingIndexesToWikiRedirects: migrated (0.0009s) ========

 

== 20091017214750 AddMissingIndexesToCustomFieldsTrackers: migrating ==========

-- add_index(:custom_fields_trackers, [:custom_field_id, :tracker_id])

   -> 0.0005s

== 20091017214750 AddMissingIndexesToCustomFieldsTrackers: migrated (0.0006s) =

 

== 20091025163651 AddActivityIndexes: migrating ===============================

-- add_index(:journals, :created_on)

   -> 0.0012s

-- add_index(:changesets, :committed_on)

   -> 0.0009s

-- add_index(:wiki_content_versions, :updated_on)

   -> 0.0006s

-- add_index(:messages, :created_on)

   -> 0.0011s

-- add_index(:issues, :created_on)

   -> 0.0024s

-- add_index(:news, :created_on)

   -> 0.0013s

-- add_index(:attachments, :created_on)

   -> 0.0009s

-- add_index(:documents, :created_on)

   -> 0.0008s

-- add_index(:time_entries, :created_on)

   -> 0.0013s

== 20091025163651 AddActivityIndexes: migrated (0.0107s) ======================

 

== 20091108092559 AddVersionsStatus: migrating ================================

-- add_column(:versions, :status, :string, {:default=>"open"})

   -> 0.0005s

== 20091108092559 AddVersionsStatus: migrated (0.0068s) =======================

 

== 20091114105931 AddViewIssuesPermission: migrating ==========================

== 20091114105931 AddViewIssuesPermission: migrated (0.0073s) =================

 

== 20091123212029 AddDefaultDoneRatioToIssueStatus: migrating =================

-- add_column(:issue_statuses, :default_done_ratio, :integer)

   -> 0.0005s

== 20091123212029 AddDefaultDoneRatioToIssueStatus: migrated (0.0005s) ========

 

== 20091205124427 AddVersionsSharing: migrating ===============================

-- add_column(:versions, :sharing, :string, {:default=>"none", :null=>false})

   -> 0.0006s

-- add_index(:versions, :sharing)

   -> 0.0007s

== 20091205124427 AddVersionsSharing: migrated (0.0015s) ======================

 

== 20091220183509 AddLftAndRgtIndexesToProjects: migrating ====================

-- add_index(:projects, :lft)

   -> 0.0006s

-- add_index(:projects, :rgt)

   -> 0.0007s

== 20091220183509 AddLftAndRgtIndexesToProjects: migrated (0.0013s) ===========

 

== 20091220183727 AddIndexToSettingsName: migrating ===========================

-- add_index(:settings, :name)

   -> 0.0006s

== 20091220183727 AddIndexToSettingsName: migrated (0.0006s) ==================

 

== 20091220184736 AddIndexesToIssueStatus: migrating ==========================

-- add_index(:issue_statuses, :position)

   -> 0.0006s

-- add_index(:issue_statuses, :is_closed)

   -> 0.0007s

-- add_index(:issue_statuses, :is_default)

   -> 0.0009s

== 20091220184736 AddIndexesToIssueStatus: migrated (0.0023s) =================

 

== 20091225164732 RemoveEnumerationsOpt: migrating ============================

-- remove_column(:enumerations, :opt)

   -> 0.0064s

== 20091225164732 RemoveEnumerationsOpt: migrated (0.0064s) ===================

 

== 20091227112908 ChangeWikiContentsTextLimit: migrating ======================

== 20091227112908 ChangeWikiContentsTextLimit: migrated (0.0000s) =============

 

== 20100129193402 ChangeUsersMailNotificationToString: migrating ==============

-- rename_column(:users, :mail_notification, :mail_notification_bool)

   -> 0.0149s

-- add_column(:users, :mail_notification, :string, {:default=>"", :null=>false})

   -> 0.0006s

-- remove_column(:users, :mail_notification_bool)

   -> 0.0092s

== 20100129193402 ChangeUsersMailNotificationToString: migrated (0.0264s) =====

 

== 20100129193813 UpdateMailNotificationValues: migrating =====================

== 20100129193813 UpdateMailNotificationValues: migrated (0.0000s) ============

 

== 20100221100219 AddIndexOnChangesetsScmid: migrating ========================

-- add_index(:changesets, [:repository_id, :scmid], {:name=>:changesets_repos_scmid})

   -> 0.0015s

== 20100221100219 AddIndexOnChangesetsScmid: migrated (0.0015s) ===============

 

== 20100313132032 AddIssuesNestedSetsColumns: migrating =======================

-- add_column(:issues, :parent_id, :integer, {:default=>nil})

   -> 0.0005s

-- add_column(:issues, :root_id, :integer, {:default=>nil})

   -> 0.0003s

-- add_column(:issues, :lft, :integer, {:default=>nil})

   -> 0.0003s

-- add_column(:issues, :rgt, :integer, {:default=>nil})

   -> 0.0004s

== 20100313132032 AddIssuesNestedSetsColumns: migrated (0.0268s) ==============

 

== 20100313171051 AddIndexOnIssuesNestedSet: migrating ========================

-- add_index(:issues, [:root_id, :lft, :rgt])

   -> 0.0025s

== 20100313171051 AddIndexOnIssuesNestedSet: migrated (0.0026s) ===============

 

== 20100705164950 ChangeChangesPathLengthLimit: migrating =====================

-- change_column(:changes, :path, :text, {:default=>nil, :null=>true})

   -> 0.0044s

-- change_column(:changes, :path, :text, {:null=>false})

   -> 0.0040s

-- change_column(:changes, :from_path, :text)

   -> 0.0039s

== 20100705164950 ChangeChangesPathLengthLimit: migrated (0.0124s) ============

 

== 20100819172912 EnableCalendarAndGanttModulesWhereAppropriate: migrating ====

== 20100819172912 EnableCalendarAndGanttModulesWhereAppropriate: migrated (0.0045s) 

 

== 20101104182107 AddUniqueIndexOnMembers: migrating ==========================

-- add_index(:members, [:user_id, :project_id], {:unique=>true})

   -> 0.0010s

== 20101104182107 AddUniqueIndexOnMembers: migrated (0.0018s) =================

 

== 20101107130441 AddCustomFieldsVisible: migrating ===========================

-- add_column(:custom_fields, :visible, :boolean, {:null=>false, :default=>true})

   -> 0.0006s

== 20101107130441 AddCustomFieldsVisible: migrated (0.0010s) ==================

 

== 20101114115114 ChangeProjectsNameLimit: migrating ==========================

-- change_column(:projects, :name, :string, {:limit=>nil, :default=>"", :null=>false})

   -> 0.0067s

== 20101114115114 ChangeProjectsNameLimit: migrated (0.0067s) =================

 

== 20101114115359 ChangeProjectsIdentifierLimit: migrating ====================

-- change_column(:projects, :identifier, :string, {:limit=>nil})

   -> 0.0066s

== 20101114115359 ChangeProjectsIdentifierLimit: migrated (0.0067s) ===========

 

== 20110220160626 AddWorkflowsAssigneeAndAuthor: migrating ====================

-- add_column(:workflows, :assignee, :boolean, {:null=>false, :default=>false})

   -> 0.0005s

-- add_column(:workflows, :author, :boolean, {:null=>false, :default=>false})

   -> 0.0003s

== 20110220160626 AddWorkflowsAssigneeAndAuthor: migrated (0.0046s) ===========

 

== 20110223180944 AddUsersSalt: migrating =====================================

-- add_column(:users, :salt, :string, {:limit=>64})

   -> 0.0005s

== 20110223180944 AddUsersSalt: migrated (0.0006s) ============================

 

== 20110223180953 SaltUserPasswords: migrating ================================

-- Salting user passwords, this may take some time...

   -> 0.0113s

== 20110223180953 SaltUserPasswords: migrated (0.0113s) =======================

 

== 20110224000000 AddRepositoriesPathEncoding: migrating ======================

-- add_column(:repositories, :path_encoding, :string, {:limit=>64, :default=>nil})

   -> 0.0005s

== 20110224000000 AddRepositoriesPathEncoding: migrated (0.0006s) =============

 

== 20110226120112 ChangeRepositoriesPasswordLimit: migrating ==================

-- change_column(:repositories, :password, :string, {:limit=>nil, :default=>""})

   -> 0.0045s

== 20110226120112 ChangeRepositoriesPasswordLimit: migrated (0.0046s) =========

 

== 20110226120132 ChangeAuthSourcesAccountPasswordLimit: migrating ============

-- change_column(:auth_sources, :account_password, :string, {:limit=>nil, :default=>""})

   -> 0.0048s

== 20110226120132 ChangeAuthSourcesAccountPasswordLimit: migrated (0.0049s) ===

 

== 20110227125750 ChangeJournalDetailsValuesToText: migrating =================

-- change_column(:journal_details, :old_value, :text)

   -> 0.0039s

-- change_column(:journal_details, :value, :text)

   -> 0.0036s

== 20110227125750 ChangeJournalDetailsValuesToText: migrated (0.0076s) ========

 

== 20110228000000 AddRepositoriesLogEncoding: migrating =======================

-- add_column(:repositories, :log_encoding, :string, {:limit=>64, :default=>nil})

   -> 0.0005s

== 20110228000000 AddRepositoriesLogEncoding: migrated (0.0005s) ==============

 

== 20110228000100 CopyRepositoriesLogEncoding: migrating ======================

== 20110228000100 CopyRepositoriesLogEncoding: migrated (0.0028s) =============

 

== 20110401192910 AddIndexToUsersType: migrating ==============================

-- add_index(:users, :type)

   -> 0.0011s

== 20110401192910 AddIndexToUsersType: migrated (0.0011s) =====================

 

== 20110408103312 AddRolesIssuesVisibility: migrating =========================

-- add_column(:roles, :issues_visibility, :string, {:limit=>30, :default=>"default", :null=>false})

   -> 0.0005s

== 20110408103312 AddRolesIssuesVisibility: migrated (0.0005s) ================

 

== 20110412065600 AddIssuesIsPrivate: migrating ===============================

-- add_column(:issues, :is_private, :boolean, {:default=>false, :null=>false})

   -> 0.0005s

== 20110412065600 AddIssuesIsPrivate: migrated (0.0005s) ======================

 

== 20110511000000 AddRepositoriesExtraInfo: migrating =========================

-- add_column(:repositories, :extra_info, :text)

   -> 0.0004s

== 20110511000000 AddRepositoriesExtraInfo: migrated (0.0005s) ================

 

== 20110902000000 CreateChangesetParents: migrating ===========================

-- create_table(:changeset_parents, {:id=>false})

   -> 0.0004s

-- add_index(:changeset_parents, [:changeset_id], {:unique=>false, :name=>:changeset_parents_changeset_ids})

   -> 0.0004s

-- add_index(:changeset_parents, [:parent_id], {:unique=>false, :name=>:changeset_parents_parent_ids})

   -> 0.0006s

== 20110902000000 CreateChangesetParents: migrated (0.0015s) ==================

 

== 20111201201315 AddUniqueIndexToIssueRelations: migrating ===================

-- add_index(:issue_relations, [:issue_from_id, :issue_to_id], {:unique=>true})

   -> 0.0011s

== 20111201201315 AddUniqueIndexToIssueRelations: migrated (0.0016s) ==========

 

== 20120115143024 AddRepositoriesIdentifier: migrating ========================

-- add_column(:repositories, :identifier, :string)

   -> 0.0005s

== 20120115143024 AddRepositoriesIdentifier: migrated (0.0005s) ===============

 

== 20120115143100 AddRepositoriesIsDefault: migrating =========================

-- add_column(:repositories, :is_default, :boolean, {:default=>false})

   -> 0.0005s

== 20120115143100 AddRepositoriesIsDefault: migrated (0.0005s) ================

 

== 20120115143126 SetDefaultRepositories: migrating ===========================

== 20120115143126 SetDefaultRepositories: migrated (0.0005s) ==================

 

== 20120127174243 AddCustomFieldsMultiple: migrating ==========================

-- add_column(:custom_fields, :multiple, :boolean, {:default=>false})

   -> 0.0005s

== 20120127174243 AddCustomFieldsMultiple: migrated (0.0006s) =================

 

== 20120205111326 ChangeUsersLoginLimit: migrating ============================

-- change_column(:users, :login, :string, {:limit=>nil, :default=>"", :null=>false})

   -> 0.0095s

== 20120205111326 ChangeUsersLoginLimit: migrated (0.0096s) ===================

 

== 20120223110929 ChangeAttachmentsContainerDefaults: migrating ===============

-- remove_index(:attachments, [:container_id, :container_type])

   -> 0.0011s

-- change_column(:attachments, :container_id, :integer, {:default=>nil, :null=>true})

   -> 0.0090s

-- change_column(:attachments, :container_type, :string, {:limit=>30, :default=>nil, :null=>true})

   -> 0.0073s

-- add_index(:attachments, [:container_id, :container_type])

   -> 0.0009s

== 20120223110929 ChangeAttachmentsContainerDefaults: migrated (0.0396s) ======

 

== 20120301153455 AddAuthSourcesFilter: migrating =============================

-- add_column(:auth_sources, :filter, :string)

   -> 0.0005s

== 20120301153455 AddAuthSourcesFilter: migrated (0.0005s) ====================

 

== 20120422150750 ChangeRepositoriesToFullSti: migrating ======================

== 20120422150750 ChangeRepositoriesToFullSti: migrated (0.0002s) =============

 

== 20120705074331 AddTrackersFieldsBits: migrating ============================

-- add_column(:trackers, :fields_bits, :integer, {:default=>0})

   -> 0.0005s

== 20120705074331 AddTrackersFieldsBits: migrated (0.0005s) ===================

 

== 20120707064544 AddAuthSourcesTimeout: migrating ============================

-- add_column(:auth_sources, :timeout, :integer)

   -> 0.0005s

== 20120707064544 AddAuthSourcesTimeout: migrated (0.0005s) ===================

 

== 20120714122000 AddWorkflowsType: migrating =================================

-- add_column(:workflows, :type, :string, {:limit=>30})

   -> 0.0004s

== 20120714122000 AddWorkflowsType: migrated (0.0005s) ========================

 

== 20120714122100 UpdateWorkflowsToSti: migrating =============================

== 20120714122100 UpdateWorkflowsToSti: migrated (0.0004s) ====================

 

== 20120714122200 AddWorkflowsRuleFields: migrating ===========================

-- add_column(:workflows, :field_name, :string, {:limit=>30})

   -> 0.0005s

-- add_column(:workflows, :rule, :string, {:limit=>30})

   -> 0.0003s

== 20120714122200 AddWorkflowsRuleFields: migrated (0.0009s) ==================

 

== 20120731164049 AddBoardsParentId: migrating ================================

-- add_column(:boards, :parent_id, :integer)

   -> 0.0004s

== 20120731164049 AddBoardsParentId: migrated (0.0005s) =======================

 

== 20120930112914 AddJournalsPrivateNotes: migrating ==========================

-- add_column(:journals, :private_notes, :boolean, {:default=>false, :null=>false})

   -> 0.0005s

== 20120930112914 AddJournalsPrivateNotes: migrated (0.0006s) =================

 

== 20121026002032 AddEnumerationsPositionName: migrating ======================

-- add_column(:enumerations, :position_name, :string, {:limit=>30})

   -> 0.0004s

== 20121026002032 AddEnumerationsPositionName: migrated (0.0005s) =============

 

== 20121026003537 PopulateEnumerationsPositionName: migrating =================

== 20121026003537 PopulateEnumerationsPositionName: migrated (0.0014s) ========

 

== 20121209123234 AddQueriesType: migrating ===================================

-- add_column(:queries, :type, :string)

   -> 0.0005s

== 20121209123234 AddQueriesType: migrated (0.0005s) ==========================

 

== 20121209123358 UpdateQueriesToSti: migrating ===============================

== 20121209123358 UpdateQueriesToSti: migrated (0.0104s) ======================

 

== 20121213084931 AddAttachmentsDiskDirectory: migrating ======================

-- add_column(:attachments, :disk_directory, :string)

   -> 0.0010s

== 20121213084931 AddAttachmentsDiskDirectory: migrated (0.0011s) =============

 

== 20130110122628 SplitDocumentsPermissions: migrating ========================

== 20130110122628 SplitDocumentsPermissions: migrated (0.0007s) ===============

 

== 20130201184705 AddUniqueIndexOnTokensValue: migrating ======================

-- Adding unique index on tokens, this may take some time...

-- add_index(:tokens, :value, {:unique=>true, :name=>"tokens_value"})

   -> 0.0008s

   -> 0.0046s

== 20130201184705 AddUniqueIndexOnTokensValue: migrated (0.0046s) =============

 

== 20130202090625 AddProjectsInheritMembers: migrating ========================

-- add_column(:projects, :inherit_members, :boolean, {:default=>false, :null=>false})

   -> 0.0005s

== 20130202090625 AddProjectsInheritMembers: migrated (0.0006s) ===============

 

== 20130207175206 AddUniqueIndexOnCustomFieldsTrackers: migrating =============

-- index_exists?(:custom_fields_trackers, [:custom_field_id, :tracker_id])

   -> 0.0004s

-- remove_index(:custom_fields_trackers, [:custom_field_id, :tracker_id])

   -> 0.0005s

-- add_index(:custom_fields_trackers, [:custom_field_id, :tracker_id], {:unique=>true})

   -> 0.0005s

== 20130207175206 AddUniqueIndexOnCustomFieldsTrackers: migrated (0.0017s) ====

 

== 20130207181455 AddUniqueIndexOnCustomFieldsProjects: migrating =============

-- index_exists?(:custom_fields_projects, [:custom_field_id, :project_id])

   -> 0.0004s

-- remove_index(:custom_fields_projects, [:custom_field_id, :project_id])

   -> 0.0005s

-- add_index(:custom_fields_projects, [:custom_field_id, :project_id], {:unique=>true})

   -> 0.0005s

== 20130207181455 AddUniqueIndexOnCustomFieldsProjects: migrated (0.0018s) ====

 

== 20130215073721 ChangeUsersLastnameLengthTo255: migrating ===================

-- change_column(:users, :lastname, :string, {:limit=>255, :default=>"", :null=>false})

   -> 0.0100s

== 20130215073721 ChangeUsersLastnameLengthTo255: migrated (0.0100s) ==========

 

== 20130215111127 AddIssuesClosedOn: migrating ================================

-- add_column(:issues, :closed_on, :datetime, {:default=>nil})

   -> 0.0006s

== 20130215111127 AddIssuesClosedOn: migrated (0.0006s) =======================

 

== 20130215111141 PopulateIssuesClosedOn: migrating ===========================

== 20130215111141 PopulateIssuesClosedOn: migrated (0.0007s) ==================

 

== 20130217094251 RemoveIssuesDefaultFkValues: migrating ======================

-- change_column_default(:issues, :tracker_id, nil)

   -> 0.0310s

-- change_column_default(:issues, :project_id, nil)

   -> 0.0309s

-- change_column_default(:issues, :status_id, nil)

   -> 0.0274s

-- change_column_default(:issues, :assigned_to_id, nil)

   -> 0.0325s

-- change_column_default(:issues, :priority_id, nil)

   -> 0.0302s

-- change_column_default(:issues, :author_id, nil)

   -> 0.0300s

== 20130217094251 RemoveIssuesDefaultFkValues: migrated (0.1822s) =============

 

== 20130602092539 CreateQueriesRoles: migrating ===============================

-- create_table(:queries_roles, {:id=>false})

   -> 0.0005s

-- add_index(:queries_roles, [:query_id, :role_id], {:unique=>true, :name=>:queries_roles_ids})

   -> 0.0005s

== 20130602092539 CreateQueriesRoles: migrated (0.0011s) ======================

 

== 20130710182539 AddQueriesVisibility: migrating =============================

-- add_column(:queries, :visibility, :integer, {:default=>0})

   -> 0.0005s

-- remove_column(:queries, :is_public)

   -> 0.0065s

== 20130710182539 AddQueriesVisibility: migrated (0.0075s) ====================

 

== 20130713104233 CreateCustomFieldsRoles: migrating ==========================

-- create_table(:custom_fields_roles, {:id=>false})

   -> 0.0005s

-- add_index(:custom_fields_roles, [:custom_field_id, :role_id], {:unique=>true, :name=>:custom_fields_roles_ids})

   -> 0.0005s

== 20130713104233 CreateCustomFieldsRoles: migrated (0.0016s) =================

 

== 20130713111657 AddQueriesOptions: migrating ================================

-- add_column(:queries, :options, :text)

   -> 0.0006s

== 20130713111657 AddQueriesOptions: migrated (0.0006s) =======================

 

== 20130729070143 AddUsersMustChangePasswd: migrating =========================

-- add_column(:users, :must_change_passwd, :boolean, {:default=>false, :null=>false})

   -> 0.0006s

== 20130729070143 AddUsersMustChangePasswd: migrated (0.0006s) ================

 

== 20130911193200 RemoveEolsFromAttachmentsFilename: migrating ================

== 20130911193200 RemoveEolsFromAttachmentsFilename: migrated (0.0009s) =======

 

== 20131004113137 SupportForMultipleCommitKeywords: migrating =================

== 20131004113137 SupportForMultipleCommitKeywords: migrated (0.0018s) ========

 

== 20131005100610 AddRepositoriesCreatedOn: migrating =========================

-- add_column(:repositories, :created_on, :timestamp)

   -> 0.0005s

== 20131005100610 AddRepositoriesCreatedOn: migrated (0.0006s) ================

 

== 20131124175346 AddCustomFieldsFormatStore: migrating =======================

-- add_column(:custom_fields, :format_store, :text)

   -> 0.0007s

== 20131124175346 AddCustomFieldsFormatStore: migrated (0.0008s) ==============

 

== 20131210180802 AddCustomFieldsDescription: migrating =======================

-- add_column(:custom_fields, :description, :text)

   -> 0.0007s

== 20131210180802 AddCustomFieldsDescription: migrated (0.0008s) ==============

 

== 20131214094309 RemoveCustomFieldsMinMaxLengthDefaultValues: migrating ======

-- change_column(:custom_fields, :min_length, :int, {:default=>nil, :null=>true})

   -> 0.0083s

-- change_column(:custom_fields, :max_length, :int, {:default=>nil, :null=>true})

   -> 0.0068s

== 20131214094309 RemoveCustomFieldsMinMaxLengthDefaultValues: migrated (0.0161s) 

 

== 20131215104612 StoreRelationTypeInJournalDetails: migrating ================

== 20131215104612 StoreRelationTypeInJournalDetails: migrated (0.0065s) =======

 

== 20131218183023 DeleteOrphanTimeEntriesCustomValues: migrating ==============

== 20131218183023 DeleteOrphanTimeEntriesCustomValues: migrated (0.0005s) =====

 

== 20140228130325 ChangeChangesetsCommentsLimit: migrating ====================

== 20140228130325 ChangeChangesetsCommentsLimit: migrated (0.0000s) ===========

 

== 20140903143914 AddPasswordChangedAtToUser: migrating =======================

-- add_column(:users, :passwd_changed_on, :datetime)

   -> 0.0005s

== 20140903143914 AddPasswordChangedAtToUser: migrated (0.0006s) ==============

 

== 20140920094058 InsertBuiltinGroups: migrating ==============================

== 20140920094058 InsertBuiltinGroups: migrated (0.0456s) =====================

 

== 20141029181752 AddTrackersDefaultStatusId: migrating =======================

-- add_column(:trackers, :default_status_id, :integer)

   -> 0.0005s

== 20141029181752 AddTrackersDefaultStatusId: migrated (0.0014s) ==============

 

== 20141029181824 RemoveIssueStatusesIsDefault: migrating =====================

-- remove_column(:issue_statuses, :is_default)

   -> 0.0072s

== 20141029181824 RemoveIssueStatusesIsDefault: migrated (0.0073s) ============

 

== 20141109112308 AddRolesUsersVisibility: migrating ==========================

-- add_column(:roles, :users_visibility, :string, {:limit=>30, :default=>"all", :null=>false})

   -> 0.0005s

== 20141109112308 AddRolesUsersVisibility: migrated (0.0005s) =================

 

== 20141122124142 AddWikiRedirectsRedirectsToWikiId: migrating ================

-- add_column(:wiki_redirects, :redirects_to_wiki_id, :integer)

   -> 0.0005s

-- change_column(:wiki_redirects, :redirects_to_wiki_id, :integer, {:null=>false})

   -> 0.0057s

== 20141122124142 AddWikiRedirectsRedirectsToWikiId: migrated (0.0089s) =======

 

== 20150113194759 CreateEmailAddresses: migrating =============================

-- create_table(:email_addresses)

   -> 0.0006s

== 20150113194759 CreateEmailAddresses: migrated (0.0006s) ====================

 

== 20150113211532 PopulateEmailAddresses: migrating ===========================

== 20150113211532 PopulateEmailAddresses: migrated (0.0043s) ==================

 

== 20150113213922 RemoveUsersMail: migrating ==================================

-- remove_column(:users, :mail)

   -> 0.0153s

== 20150113213922 RemoveUsersMail: migrated (0.0154s) =========================

 

== 20150113213955 AddEmailAddressesUserIdIndex: migrating =====================

-- add_index(:email_addresses, :user_id)

   -> 0.0007s

== 20150113213955 AddEmailAddressesUserIdIndex: migrated (0.0007s) ============

 

== 20150208105930 ReplaceMoveIssuesPermission: migrating ======================

== 20150208105930 ReplaceMoveIssuesPermission: migrated (0.0006s) =============

 

== 20150510083747 ChangeDocumentsTitleLimit: migrating ========================

-- change_column(:documents, :title, :string, {:limit=>nil, :default=>"", :null=>false})

   -> 0.0079s

== 20150510083747 ChangeDocumentsTitleLimit: migrated (0.0079s) ===============

 

== 20150525103953 ClearEstimatedHoursOnParentIssues: migrating ================

== 20150525103953 ClearEstimatedHoursOnParentIssues: migrated (0.0012s) =======

 

== 20150526183158 AddRolesTimeEntriesVisibility: migrating ====================

-- add_column(:roles, :time_entries_visibility, :string, {:limit=>30, :default=>"all", :null=>false})

   -> 0.0005s

== 20150526183158 AddRolesTimeEntriesVisibility: migrated (0.0005s) ===========

 

== 20150528084820 AddRolesAllRolesManaged: migrating ==========================

-- add_column(:roles, :all_roles_managed, :boolean, {:default=>true, :null=>false})

   -> 0.0005s

== 20150528084820 AddRolesAllRolesManaged: migrated (0.0005s) =================

 

== 20150528092912 CreateRolesManagedRoles: migrating ==========================

-- create_table(:roles_managed_roles, {:id=>false})

   -> 0.0004s

== 20150528092912 CreateRolesManagedRoles: migrated (0.0005s) =================

 

== 20150528093249 AddUniqueIndexOnRolesManagedRoles: migrating ================

-- add_index(:roles_managed_roles, [:role_id, :managed_role_id], {:unique=>true})

   -> 0.0006s

== 20150528093249 AddUniqueIndexOnRolesManagedRoles: migrated (0.0007s) =======

 

== 20150725112753 InsertAllowedStatusesForNewIssues: migrating ================

== 20150725112753 InsertAllowedStatusesForNewIssues: migrated (0.0025s) =======

 

== 20150730122707 CreateImports: migrating ====================================

-- create_table(:imports)

   -> 0.0006s

== 20150730122707 CreateImports: migrated (0.0007s) ===========================

 

== 20150730122735 CreateImportItems: migrating ================================

-- create_table(:import_items)

   -> 0.0005s

== 20150730122735 CreateImportItems: migrated (0.0006s) =======================

 

== 20150921204850 ChangeTimeEntriesCommentsLimitTo1024: migrating =============

-- change_column(:time_entries, :comments, :string, {:limit=>1024})

   -> 0.0127s

== 20150921204850 ChangeTimeEntriesCommentsLimitTo1024: migrated (0.0128s) ====

 

== 20150921210243 ChangeWikiContentsCommentsLimitTo1024: migrating ============

-- change_column(:wiki_content_versions, :comments, :string, {:limit=>1024, :default=>""})

   -> 0.0063s

-- change_column(:wiki_contents, :comments, :string, {:limit=>1024, :default=>""})

   -> 0.0057s

== 20150921210243 ChangeWikiContentsCommentsLimitTo1024: migrated (0.0121s) ===

 

== 20151020182334 ChangeAttachmentsFilesizeLimitTo8: migrating ================

-- change_column(:attachments, :filesize, :integer, {:limit=>8, :default=>0, :null=>false})

   -> 0.0093s

== 20151020182334 ChangeAttachmentsFilesizeLimitTo8: migrated (0.0093s) =======

 

== 20151020182731 FixCommaInUserFormatSettingValue: migrating =================

== 20151020182731 FixCommaInUserFormatSettingValue: migrated (0.0007s) ========

 

== 20151021184614 ChangeIssueCategoriesNameLimitTo60: migrating ===============

-- change_column(:issue_categories, :name, :string, {:limit=>60, :default=>"", :null=>false})

   -> 0.0061s

== 20151021184614 ChangeIssueCategoriesNameLimitTo60: migrated (0.0061s) ======

 

== 20151021185456 ChangeAuthSourcesFilterToText: migrating ====================

-- change_column(:auth_sources, :filter, :text)

   -> 0.0054s

== 20151021185456 ChangeAuthSourcesFilterToText: migrated (0.0054s) ===========

 

== 20151021190616 ChangeUserPreferencesHideMailDefaultToTrue: migrating =======

-- change_column(:user_preferences, :hide_mail, :boolean, {:default=>true})

   -> 0.0043s

== 20151021190616 ChangeUserPreferencesHideMailDefaultToTrue: migrated (0.0043s) 

 

== 20151024082034 AddTokensUpdatedOn: migrating ===============================

-- add_column(:tokens, :updated_on, :timestamp)

   -> 0.0005s

== 20151024082034 AddTokensUpdatedOn: migrated (0.0010s) ======================

 

== 20151025072118 CreateCustomFieldEnumerations: migrating ====================

-- create_table(:custom_field_enumerations)

   -> 0.0006s

== 20151025072118 CreateCustomFieldEnumerations: migrated (0.0006s) ===========

 

== 20151031095005 AddProjectsDefaultVersionId: migrating ======================

-- column_exists?(:projects, :default_version_id, :integer)

   -> 0.0003s

-- add_column(:projects, :default_version_id, :integer, {:default=>nil})

   -> 0.0005s

== 20151031095005 AddProjectsDefaultVersionId: migrated (0.0009s) =============

 

== 20160404080304 ForcePasswordResetDuringSetup: migrating ====================

== 20160404080304 ForcePasswordResetDuringSetup: migrated (0.0007s) ===========

 

== 20160416072926 RemovePositionDefaults: migrating ===========================

-- change_column("boards", :position, :integer, {:default=>nil})

   -> 0.0075s

-- change_column("custom_fields", :position, :integer, {:default=>nil})

   -> 0.0063s

-- change_column("enumerations", :position, :integer, {:default=>nil})

   -> 0.0061s

-- change_column("issue_statuses", :position, :integer, {:default=>nil})

   -> 0.0055s

-- change_column("roles", :position, :integer, {:default=>nil})

   -> 0.0038s

-- change_column("trackers", :position, :integer, {:default=>nil})

   -> 0.0035s

== 20160416072926 RemovePositionDefaults: migrated (0.0330s) ==================

 

== 20160529063352 AddRolesSettings: migrating =================================

-- add_column(:roles, :settings, :text)

   -> 0.0005s

== 20160529063352 AddRolesSettings: migrated (0.0005s) ========================

 

== 20161001122012 AddTrackerIdIndexToWorkflows: migrating =====================

-- add_index(:workflows, :tracker_id)

   -> 0.0016s

== 20161001122012 AddTrackerIdIndexToWorkflows: migrated (0.0017s) ============

 

== 20161002133421 AddIndexOnMemberRolesInheritedFrom: migrating ===============

-- add_index(:member_roles, :inherited_from)

   -> 0.0012s

== 20161002133421 AddIndexOnMemberRolesInheritedFrom: migrated (0.0012s) ======

 

== 20161010081301 ChangeIssuesDescriptionLimit: migrating =====================

== 20161010081301 ChangeIssuesDescriptionLimit: migrated (0.0000s) ============

 

== 20161010081528 ChangeJournalDetailsValueLimit: migrating ===================

== 20161010081528 ChangeJournalDetailsValueLimit: migrated (0.0000s) ==========

 

== 20161010081600 ChangeJournalsNotesLimit: migrating =========================

== 20161010081600 ChangeJournalsNotesLimit: migrated (0.0000s) ================

 

== 20161126094932 AddIndexOnChangesetsIssuesIssueId: migrating ================

-- add_index(:changesets_issues, :issue_id)

   -> 0.0008s

== 20161126094932 AddIndexOnChangesetsIssuesIssueId: migrated (0.0008s) =======

 

== 20161220091118 AddIndexOnIssuesParentId: migrating =========================

-- add_index(:issues, :parent_id)

   -> 0.0027s

== 20161220091118 AddIndexOnIssuesParentId: migrated (0.0027s) ================

 

== 20170207050700 AddIndexOnDiskFilenameToAttachments: migrating ==============

-- add_index(:attachments, :disk_filename)

   -> 0.0014s

== 20170207050700 AddIndexOnDiskFilenameToAttachments: migrated (0.0014s) =====

 

== 20170302015225 ChangeAttachmentsDigestLimitTo64: migrating =================

-- change_column(:attachments, :digest, :string, {:limit=>64})

   -> 0.0167s

== 20170302015225 ChangeAttachmentsDigestLimitTo64: migrated (0.0167s) ========

 

== 20170309214320 AddProjectDefaultAssignedToId: migrating ====================

-- add_column(:projects, :default_assigned_to_id, :integer, {:default=>nil})

   -> 0.0005s

-- column_exists?(:projects, :default_assignee_id, :integer)

   -> 0.0003s

== 20170309214320 AddProjectDefaultAssignedToId: migrated (0.0009s) ===========

 

== 20170320051650 ChangeRepositoriesExtraInfoLimit: migrating =================

== 20170320051650 ChangeRepositoriesExtraInfoLimit: migrated (0.0000s) ========

 

== 20170418090031 AddViewNewsToAllExistingRoles: migrating ====================

== 20170418090031 AddViewNewsToAllExistingRoles: migrated (0.0052s) ===========

 

== 20170419144536 AddViewMessagesToAllExistingRoles: migrating ================

== 20170419144536 AddViewMessagesToAllExistingRoles: migrated (0.0052s) =======

 

Removing intermediate container 5269974f0c1e

 ---> d2f4120f7069

Step 14/16 : RUN bundle exec rake generate_secret_token

 ---> Running in dbbc054c9ba8

Removing intermediate container dbbc054c9ba8

 ---> 2835917901b8

Step 15/16 : CMD bundle exec rails s -p 3000 -b '0.0.0.0'

 ---> Running in 4bebb0695545

Removing intermediate container 4bebb0695545

 ---> b9907122d720

Step 16/16 : EXPOSE 3000

 ---> Running in 9f51de3e8ec2

Removing intermediate container 9f51de3e8ec2

 ---> 2eda68bb2568

Successfully built 2eda68bb2568

Successfully tagged redmine_sqlite3:latest

mbp:redmine_my_plugin sioaji$ docker-compose up

Creating network "redminemyplugin_default" with the default driver

Creating redmine_sqlite3 ... done

Attaching to redmine_sqlite3

redmine_sqlite3 | [2018-04-11 15:45:19] INFO  WEBrick 1.3.1

redmine_sqlite3 | [2018-04-11 15:45:19] INFO  ruby 2.4.2 (2017-09-14) [x86_64-linux]

redmine_sqlite3 | [2018-04-11 15:45:19] INFO  WEBrick::HTTPServer#start: pid=9 port=3000

 

 

*1:l

mbp:redmine_my_plugin sioaji$ docker-compose build

WARNING: The REDMINE_VERSION variable is not set. Defaulting to a blank string.

Building web

Step 1/16 : FROM ruby:2.4.2

 ---> 2a867526d472

Step 2/16 : LABEL maintainer="AKIKO TAKANO / (Twitter: @akiko_pusu)"   description="Image to run Redmine simply with sqlite to try/review plugin."

 ---> Using cache

 ---> 884cc8d12364

Step 3/16 : ARG REDMINE_VERSION="3.4-stable"

 ---> Using cache

 ---> 4006a4d4df42

Step 4/16 : RUN rm /bin/sh && ln -s /bin/bash /bin/sh && echo "REDMINE_VERSION: ${REDMINE_VERSION}"

 ---> Using cache

 ---> 1631495b43da

Step 5/16 : RUN apt-get update

 ---> Using cache

 ---> 7eef7875f956

Step 6/16 : RUN apt-get install -qq -y     git vim                sqlite3

 ---> Using cache

 ---> 08e3c2253160

Step 7/16 : RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine

 ---> Running in da5274b9361c

Cloning into 'redmine'...

warning: Could not find remote branch :-3.4-stable to clone.

fatal: Remote branch :-3.4-stable not found in upstream origin

ERROR: Service 'web' failed to build: The command '/bin/sh -c cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine' returned a non-zero code: 128

mbp:redmine_my_plugin sioaji$ 

*2:

FROM ruby:2.4.2
LABEL maintainer="AKIKO TAKANO / (Twitter: @akiko_pusu)" \
description="Image to run Redmine simply with sqlite to try/review plugin."

#
# You can run target version of Redmine.
# If you use this Dockerfile only, try this:
# $ docker build -t redmine_stable .
# $ docker run -d -p 3000:3000 redmine_stable
#
# You can change Redmine version with arg
# $ docker build --rm --build-arg REDMINE_VERSION=master -t redmine_master .
# $ docker run -d -p 3000:3000 redmine_master
#

### get Redmine source
ARG REDMINE_VERSION="3.4-stable"

### Replace shell with bash so we can source files ###
RUN rm /bin/sh && ln -s /bin/bash /bin/sh && echo "REDMINE_VERSION: ${REDMINE_VERSION}"

### install default sys packeges ###

RUN apt-get update
RUN apt-get install -qq -y \
git vim \
sqlite3

RUN cd /tmp && git clone --depth 1 -b ${REDMINE_VERSION} https://github.com/redmine/redmine redmine
RUN echo "REDMINE_VERSION: ${REDMINE_VERSION}"
WORKDIR /tmp/redmine

RUN echo $'test:\n\
adapter: sqlite3\n\
database: /tmp/data/redmine_test.sqlite3\n\
encoding: utf8mb4\n\
\n\
development:\n\
adapter: sqlite3\n\
database: /tmp/data/redmine_development.sqlite3\n\
encoding: utf8mb4\n'\
>> config/database.yml

RUN gem update bundler
RUN bundle install --without mysql postgresql rmagick test
RUN bundle exec rake db:migrate
RUN bundle exec rake generate_secret_token
CMD bundle exec rails s -p 3000 -b '0.0.0.0'
EXPOSE 3000

*3:

mbp:tmp sioaji$ mkdir test

mbp:tmp sioaji$ ls

test

mbp:tmp sioaji$ cd test

mbp:test sioaji$ git clone --depth 1 -b 3.4-stable https://github.com/redmine/redmine redmine

Cloning into 'redmine'...

remote: Counting objects: 2176, done.

remote: Compressing objects: 100% (1930/1930), done.

remote: Total 2176 (delta 402), reused 909 (delta 173), pack-reused 0

Receiving objects: 100% (2176/2176), 2.66 MiB | 2.33 MiB/s, done.

Resolving deltas: 100% (402/402), done.

Checking out files: 100% (2115/2115), done.

mbp:test sioaji$ ls

redmine

mbp:test sioaji$ cd redmine/

mbp:redmine sioaji$ ls

CONTRIBUTING.md Rakefile bin db files plugins test

Gemfile app config doc lib public tmp

README.rdoc appveyor.yml config.ru extra log script

mbp:redmine sioaji$ 

*4:version: '3'
services:
# start service for redmine with plugin
# 1. $ docker-compose build --force-rm --no-cache
# 2. $ docker-compose up -d
#
# If you want to change Redmine's version,
#
# 1. $ REDMINE_VERSION=master docker-compose build --force-rm --no-cache
# 2. $ docker-compose up -d
#
#
web:
build:
context: .
args:
REDMINE_VERSION: $REDMINE_VERSION:-3.4-stable
image: redmine_sqlite3
container_name: redmine_sqlite3
command: >
bash -c "bundle exec rake redmine:plugins:migrate &&
bundle exec rails s -p 3000 -b '0.0.0.0'"
environment:
RAILS_ENV: development
volumes:
- .:/tmp/redmine/plugins/redmine_issue_badge
ports:
- "3000:3000"