6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DockerでWindows機のメンバーのRails環境セットアップ(Herokuプロジェクト)

Last updated at Posted at 2016-12-26

はじめに

Windowsを使っているデザイナーさんにRailsプロジェクトのcssをいじってもらうために環境を作らなければならなくなり、Railsのセットアップをやってもらうのはハードルが高いなあと思い、初めてDockerに挑戦してみることにしました。

前提

heroku上にある既存のRailsプロジェクトをwindows環境で実行できるようにします。

  • ruby2.3.1
  • rails5.0
  • postgresql
  • heroku

Dockerについて

Dockerについてははこちらの記事を読むとDockerのことがざっとわかると思います。
2016年版、Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き)

Docker-composeの構成

今回の構成は以下の前提を元に作られています。

  • プロジェクトのマスターはHerokuにあり随時git pull/pushする
  • データベースの中身はプレビュー用に必要なものだけ入っていればよく、データ構造が変わったときにだけ更新されるのでローカルにdumpを置きイメージ作成時にリストアされるようにする

ディレクトリ構成

my_projectディレクトリを作成し、docker-compose.ymlとDockerfileをその直下に置きます。
またHerokuにあるステージングappのデータベースをエキスポートし、db/latest.dumpに置きました。
appディレクトリにはgit cloneしたRailsのプロジェクトデータ一式を置きます。

+ my_project
	- docker-compose.yml
	- Dockerfile
	+ db
		- latest.dump
	+ app // git cloneしたRailsプロジェクトデータ一式(Gemfile等含む)

docker-composeファイルの中身

docker-compose.yml
version: '2'
services:
  db:
    image: postgres
    expose:
      - "5432"
    volumes:
      - psql-data:/db
      - ./db:/db
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./my_app:/app  
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
    psql-data:
      driver: local

Windows特有の問題
Windowsだとdocker-composeのバージョンによってはvolumeのパスに./my_app:/appのような相対パスが使えません。dockerは元々LINUXベースのためWindowsスタイルのパスをうまく読み込めないらしいです。
対応策としては、最新のdocker for Windowsを使うか\c\Users\hoge\のような絶対パスで記述する、またはdocker toolboxを使う場合docker-compose1.9.0以上で環境変数COMPOSE_CONVERT_WINDOWS_PATHS=1に設定することで相対パスが使えるようになります。

参考:
On native Windows, paths should not be "UNIXized"| docker/compose
Do not normalize volume paths on Windows by default | docker/compose

Dockerfileの中身

FROM ruby:2.3.1

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /app
ADD ./app /app
ADD ./db /db
WORKDIR /app
RUN bundle install

database.ymlを変更

Docker上のPostgreSQLに接続するためにプロジェクトのdatabase.ymlを変更する必要があります。
developmentのhostをdbに、usernameをpostgresに変更します。

config/database.yml
development:
  <<: *default
  host: db
  username: postgres

今回はベタで書いてしまいましたが、ENV['postgresuser']みたいに環境変数で設定する方が状況によっては良いかも。

docker-composeでイメージの作成とデータインポート

ファイル構成が全部できたらdocker-composeファイルに従ってdockerイメージをビルドします。
必要なファイル類のインストールがすべて行われるのでビルドには時間がかかりますのでしばらく放置。

$ docker-compose build

PostgreSQLのデータベース作成・マイグレーション・データリストア

データベースを作成し、マイグレーション。
Herokuのステージングappのdumpデータをインポートします。

# DB作成とマイグレーション
$ docker-compose run web bundle exec rake db:create
$ docker-compose run web bundle exec rake db:migrate

# DBのコンテナ名を調べる
$ DOCKER_DB_NAME=`docker-compose ps -q DB_CONTAINER_NAME`

# Heroku appのdumpデータをリストア
$ docker exec -i $DOCKER_DB_NAME pg_restore --verbose --clean --no-acl --no-owner -U PG_USERNAME -d DB_NAME < PATH_TO_DUMPFILE

HerokuからダウンロードしたPostgreSQLのデータをリストアする方法を探すのにすごく苦労しました。
参考先のサイトのページの管理者様に感謝。

参考:pg_restore a local db dump into Docker

Windows特有の問題
2016年12月現在のWindows版docker-composeだとdocker-compose runコマンドが使えないようです。
docker-compose1.9.0からは使えるようになっているとのことだったので1.9.0RC版を導入してみましたが問題なく使えました。

参考:windows環境でのdocker-composeのInteractive Modeが実行出来ないのが解決した | Qiita

メンバー側の準備

1. Dockerのインストール

Docker for Mac https://docs.docker.com/docker-for-mac/

Docker for Windows https://docs.docker.com/docker-for-windows/

Stable Channelの項目の下にある Get Docker for MacまたはWindows(stable) ボタンを押してアプリをダウンロード、インストールします。

WindowsのOSの種類によってはDocker for Windowsが使えないことがあります。
2016年12月時点ではWindows10 Homeはダメでした。
Macでもダメなことがあるのかな?わかりません。
ダメだった場合はDocker Toolboxをダウンロードします。
Docker Toolbox 
https://www.docker.com/products/docker-toolbox
Mac/Win該当のOSのマークのボタンを押すとgithubに飛ぶのでページ下部にあるリンクからファイルをダウンロードしインストールます。
Windowsなら.exe、Macなら.pkgです。

2. Herokuのappデータをローカルに落とす

※ Heroku上のプロジェクトをチームで作るのでなければこのステップは不要です。

[1] Heroku toolbeltのインストール

以下のページのWindowsのところにあるWindows Installerをクリック/ダウンロードしてインストールします。
https://devcenter.heroku.com/articles/heroku-command-line

Heroku toolbeltのフルパッケージを選択することでgit関連のツールもまとめてインストールできます。

[2] プロジェクトデータをclone

コマンドプロンプトでプロジェクトを作りたい場所に移動し、以下のコマンドでHeroku上のappデータをclone

$ heroku git:clone -a APP_NAME

※ Herokuのappオーナー側で事前にコラボレーターの追加を行う必要があります。
参考:Collaborating with Other Developers on Your App | Heroku

[3] Dockerのセッティング

dockerファイル一式をまとめたものを環境を作ってる人から受け取ります。このフォルダ名をmy_projectとします。
my_projectフォルダ内にHerokuから落としてきたソースファイルのフォルダを移動してappという名前に変更します。
フォルダ構成は以下のようになります。

+ my_project
	+ db
	+ app
	- docker-compose.yml
	- Dockerfile

環境変数の設定

Windows10なら左下の検索窓で「環境変数」と入力すれば環境変数の設定ウインドウが開きます。
ユーザー環境変数の「新規」で以下の2つを設定します。
①変数:COMPOSE_CONVERT_WINDOWS_PATHS 値:1
②変数:MY_PROJECT_HOST 値:http://192.168.99.100:3000

※MY_PROJECT_HOSTはrails内でasset_hostの設定に使います。

Docker Quickstart Terminalでコマンド入力して初期設定

Docker Toolboxをインストールした際に Docker Quick Start Terminalというアプリが入ったと思います。
Docker Quick Start Terminalを起動し、以下のコマンドを一行ずつ順番に入れて実行します。

$ cd docker-compose.ymlのフォルダパス
$ docker-compose build
$ docker-compose up -d
$ docker-compose run web rake db:create
$ docker-compose run web rake db:migrate
$ DOCKER_DB_NAME=`docker-compose ps -q db`
$ docker exec -i $DOCKER_DB_NAME pg_restore --verbose --clean --no-acl --no-owner -U postgres -d kodomoto_dev < ./db/latest.dump

準備はここまでで終了です。

※ほんとは上のコマンドをデザイナーさんに全部やってもらうのは微妙なのでバッチファイルにしたかったのですがうまくできませんでした。わかる方いたらぜひ教えてください。

アプリの起動と終了

長くなったので別記事に分けました。
Docker-composeの起動と終了(Windows)

番外編:Postgresqlのローカルホストに接続する(検討してやめた)

Herokuのステージングappのpostgresのデータをローカルにインポートしたかったので、PostgreSQLをDocker化せずRailsコンテナからlocalhostに接続するという方法も検討しました。
この方法にする利点としてはdropdbheroku pg:pullの二つのコマンドだけでステージング環境からデータベースのインポートができるので更新があった場合にも簡便だということがあります。
しかし調べてみたら設定周りでとてもデザイナーさんにやってもらうのには面倒そうなものがあったのでやめました……。

参考:Allow docker container to connect to a local/host postgres database | stack overflow

参考

Container Registry and Runtime | Heroku
Docker-compose.yml: from V1 to V2
docker-compose で Rails の開発環境を作る
DockerToolboxで作るWindows用開発環境の構築

6
8
0

Register as a new user and use Qiita more conveniently

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?