├── apps └── .keep ├── init ├── Gemfile.lock └── Gemfile ├── .gitignore ├── setup.sh ├── docker-compose.yml ├── docker-compose.win.yml ├── Dockerfile ├── README.md ├── README.win.md └── RAILS.md /apps/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /init/Gemfile.lock: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /init/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'rails', '~> 6.0.0' 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /apps/* 2 | !/apps/.keep 3 | /tmp/* 4 | !/tmp/.keep 5 | docker-compose.override.yml 6 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eu 3 | 4 | docker pull oiax/rails6-deps:latest 5 | 6 | BUILD_CMD="docker-compose build --no-cache" 7 | 8 | case "$OSTYPE" in 9 | darwin*) 10 | $BUILD_CMD web 11 | ;; 12 | linux*) 13 | $BUILD_CMD --build-arg UID=$(id -u) --build-arg GID=$(id -g) web 14 | ;; 15 | *) 16 | echo "Unknown OS Type: $OSTYPE" 17 | ;; 18 | esac 19 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | db: 4 | image: postgres:11.2-alpine 5 | volumes: 6 | - ./tmp/db:/var/lib/postgresql/data 7 | web: 8 | build: . 9 | command: /bin/sh 10 | environment: 11 | WEBPACKER_DEV_SERVER_HOST: "0.0.0.0" 12 | RAILS_SERVE_STATIC_FILES: "1" 13 | EDITOR: "vim" 14 | volumes: 15 | - ./apps:/apps 16 | ports: 17 | - "3000:3000" 18 | - "3035:3035" 19 | depends_on: 20 | - db 21 | tty: true 22 | -------------------------------------------------------------------------------- /docker-compose.win.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | db: 4 | image: postgres:11.2-alpine 5 | volumes: 6 | - data:/var/lib/postgresql/data 7 | web: 8 | build: . 9 | command: /bin/sh 10 | environment: 11 | WEBPACKER_DEV_SERVER_HOST: "0.0.0.0" 12 | RAILS_SERVE_STATIC_FILES: "1" 13 | EDITOR: "vim" 14 | volumes: 15 | - ./apps:/apps 16 | ports: 17 | - "3000:3000" 18 | - "3035:3035" 19 | depends_on: 20 | - db 21 | tty: true 22 | volumes: 23 | data: 24 | external: 25 | name: pgdata 26 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM oiax/rails6-deps:latest 2 | 3 | ARG UID=1000 4 | ARG GID=1000 5 | 6 | RUN mkdir /var/mail 7 | RUN groupadd -g $GID devel 8 | RUN useradd -u $UID -g devel -m devel 9 | RUN echo "devel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers 10 | 11 | WORKDIR /tmp 12 | COPY init/Gemfile /tmp/Gemfile 13 | COPY init/Gemfile.lock /tmp/Gemfile.lock 14 | RUN bundle install 15 | 16 | COPY ./apps /apps 17 | 18 | RUN apk add --no-cache openssl shared-mime-info 19 | 20 | USER devel 21 | 22 | RUN openssl rand -hex 64 > /home/devel/.secret_key_base 23 | RUN echo $'export SECRET_KEY_BASE=$(cat /home/devel/.secret_key_base)' \ 24 | >> /home/devel/.bashrc 25 | 26 | WORKDIR /apps 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rails6-compose 2 | 3 | Docker を用いて Rails 6 アプリケーションの開発・学習を始めるための設定ファイル等のセット 4 | 5 | ## 必要なソフトウェア 6 | 7 | * Docker 18 以上 8 | * Git 2.7 以上 9 | 10 | ## 動作確認済みのOS 11 | 12 | * macOS 10.14 Mojave 13 | * Ubuntu 16.04 14 | * Ubuntu 18.04 15 | 16 | ※ Windowsユーザーの方は [README.win.md](README.win.md) を参照してください。 17 | 18 | ## 凡例 19 | 20 | * この文書(README.md)では、Rails 6 アプリケーション開発の基盤となるふたつのコンテナ(`db` と `web`)を構築、起動、停止、破棄する手順および `web` コンテナにログインする方法を説明します。 21 | * `web` コンテナ上で Rails アプリケーションの骨格を作り、データベースを初期化する手順については [RAILS.md](RAILS.md) を参照してください。 22 | * ターミナルでコマンドを実行することで作業が進んでいきます。 23 | * コマンドを入力する際には、行頭にある `%` 記号を省いてください。 24 | 25 | ## 設定ファイル等の取得 26 | 27 | ``` 28 | % git clone https://github.com/oiax/rails6-compose.git 29 | % cd rails6-compose 30 | ``` 31 | 32 | ## コンテナ群の構築 33 | 34 | ``` 35 | % ./setup.sh 36 | ``` 37 | 38 | ## コンテナ群の起動 39 | 40 | ``` 41 | % docker-compose up -d 42 | ``` 43 | 44 | ## Web コンテナにログイン 45 | 46 | ``` 47 | % docker-compose exec web bash 48 | ``` 49 | 50 | ※ ログアウトするには `exit` コマンドを実行するか、`Ctrl-D` キーを入力してください。 51 | 52 | ## コンテナ群の停止 53 | 54 | ``` 55 | % docker-compose stop 56 | ``` 57 | 58 | ## コンテナ群の破棄 59 | 60 | ``` 61 | % docker-compose down 62 | ``` 63 | -------------------------------------------------------------------------------- /README.win.md: -------------------------------------------------------------------------------- 1 | # rails6-compose (for Windows) 2 | 3 | Docker for Windows を用いて Rails 6 アプリケーションの開発・学習を始めるための設定ファイル等のセット 4 | 5 | ## 必要なソフトウェア 6 | 7 | * Docker Desktop for Windows 18 以上 8 | * Git for Windows 2.20 以上 9 | 10 | ## 動作確認済みのOS 11 | 12 | * Windows 10 64bit: Pro/Enterprise/Education 13 | 14 | ※ この文章の末尾にある「Windows 10 Home ユーザーへの注記」を参照してください。 15 | 16 | ## 凡例 17 | 18 | * この文書(README.md)では、Rails 6 アプリケーション開発の基盤となるふたつのコンテナ(`db` と `web`)を構築、起動、停止、破棄する手順および `web` コンテナにログインする方法を説明します。 19 | * `web` コンテナ上で Rails アプリケーションの骨格を作り、データベースを初期化する手順については [RAILS.md](RAILS.md) を参照してください。 20 | * コマンドプロンプト(cmd.exe)でコマンドを実行してください。Git for Windows 付属の Git Bash ではうまく行きません。 21 | * コマンドを入力する際には、行頭にある `>` 記号を省いてください。 22 | 23 | ## 設定ファイル等の取得 24 | 25 | ``` 26 | > git clone https://github.com/oiax/rails6-compose.git 27 | > cd rails6-compose 28 | > cp docker-compose.win.yml docker-compose.override.yml 29 | ``` 30 | 31 | ## ボリュームの作成 32 | 33 | ``` 34 | > docker volume create --name pgdata 35 | ``` 36 | 37 | ### ボリュームの作成に関する注記 38 | 39 | * 複数の Rails アプリケーション開発プロジェクトを並行して進める場合、上記コマンドの `pgdata` の部分をそれぞれ別の名前、例えば `pgdata1` と `pgdata2` で置き換える必要があります。 40 | * その場合、テキストエディタで `docker-compose.override.yml` を開き、`pgdata` と書かれている箇所を `pgdate1` あるいは `pgdate2` で書き換えてください。 41 | * macOS や Ubuntu での手順と異なり、Windows では明示的にボリュームを作成する必要があります。これは、[docker/for-win#1976](https://github.com/docker/for-win/issues/445) で報告されている問題を回避するためです。2018年7月に[解決策](https://github.com/docker/for-win/issues/445#issuecomment-405185621)が提案されて当該 Issue はクローズされていますが、いまだ根本的な解決には至っていません。 42 | 43 | ## コンテナ群の構築 44 | 45 | ``` 46 | > docker pull oiax/rails6-deps:latest 47 | > docker-compose build 48 | ``` 49 | 50 | ## コンテナ群の起動 51 | 52 | ``` 53 | > docker-compose up -d 54 | ``` 55 | 56 | ## Web コンテナにログイン 57 | 58 | ``` 59 | > docker-compose exec web bash 60 | ``` 61 | 62 | ※ ログアウトするには `exit` コマンドを実行するか、`Ctrl-D` キーを入力してください。 63 | 64 | ## コンテナ群の停止 65 | 66 | ``` 67 | > docker-compose stop 68 | ``` 69 | 70 | ## コンテナ群の破棄 71 | 72 | ``` 73 | > docker-compose down 74 | ``` 75 | 76 | ## ボリュームの破棄 77 | 78 | ``` 79 | > docker volume rm pgdata 80 | ``` 81 | 82 | ## Windows 10 Home ユーザーへの注記 83 | 84 | [Docker for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows) は、以下の条件を満たさないと動きません。 85 | 86 | * Windows 10 のバージョンが Pro または Enterprise または Education の 64 bit 版である。 87 | * BIOS の仮想化機能が有効に設定されている。 88 | 89 | つまり、個人・家庭向けの一般的なパソコンにインストールされている Windows 10 Home で Docker for Windows は動きません。追加の費用を支払って Windows 10 Home を Windows 10 Pro にアップグレードする必要があります。 90 | 91 | そこで、Windows 10 Home ユーザーには [Oracle VM VirtualBox](https://www.virtualbox.org/) の利用をお勧めします。 92 | 93 | VirtualBox をインストールして、仮想マシン上に適当な Linux 系の OS(例えば、[Ubuntu](http://www.ubuntulinux.jp/))をインストールします。そして、その上で Docker を使用するのです。 94 | 95 | VirtualBox 上の仮想マシンは 1 台ですが、その上で複数のコンテナを起動できるので、複数の Rails 開発プロジェクトを並行して進めたり、多数のコンテナから構成される複雑なシステムを組んだりできます。 96 | 97 | ちなみに、Windows パソコンに「デュアルブート」方式で Ubuntu 等をインストールすることも可能ですが、一般的には推奨できません。ハードウェア構成によっては非常に難しい作業を行うことになります。Windows 自体に深刻な悪影響を与える可能性もあります。 98 | 99 | ### Docker Toolbox について 100 | 101 | Windows 10 Home では [Docker Toolbox](https://docs.docker.com/toolbox/toolbox_install_windows/) が使えるという情報もありますが、筆者の環境ではうまく動きませんでした。 102 | -------------------------------------------------------------------------------- /RAILS.md: -------------------------------------------------------------------------------- 1 | # RAILS.md 2 | 3 | [oiax/rails6-compose](https://github.com/oiax/rails6-compose) をベースに Rails 6 アプリケーションの開発・学習を始める手順を解説します。 4 | 5 | ## アプリケーション開発の方針 6 | 7 | * データベース管理システム(DBMS)には PostgreSQL を使用する。 8 | * Sprockets を使わない。 9 | * Webpacker を使う。 10 | 11 | ## 凡例 12 | 13 | * 基本的に、ターミナルでコマンドを実行することで作業が進んでいきます。 14 | * コマンドを入力する際には、行頭にある `%` 記号および `$` 記号を省いてください。 15 | * `%` 記号の付いたコマンドは、ホスト OS のターミナル(Windows の場合は、コマンドプロンプト)で入力してください。 16 | * `$` 記号の付いたコマンドは、Web コンテナのターミナルで入力してください。 17 | 18 | ## Railsアプリケーションの骨格を作る 19 | 20 | Web コンテナにログインして以下のコマンド群を実行します。 21 | 22 | ``` 23 | $ cd /apps 24 | $ rails new myapp -BJS -d postgresql 25 | ``` 26 | 27 | ※ `myapp` の部分は適宜置き換えてください。ここに指定された文字列がアプリケーション名となります。 28 | 29 | ### 指定されたオプションの説明 30 | 31 | * `-B`: `bundle install` の実行を後回しにする。 32 | * `-J`: JavaScriptファイル群を生成しない。 33 | * `-S`: Sprocketsファイル群を生成しない。 34 | * `-d`: 選択されたデータベース管理システム(PostgreSQL)用の設定ファイルを生成する 35 | 36 | ※ Webpacker は後で導入します。 37 | 38 | ## Webコンテナからログアウト 39 | 40 | ``` 41 | $ exit 42 | ``` 43 | 44 | ## ソースコードの編集 45 | 46 | * ホスト OS 側のテキストエディタで Rails アプリケーションのソースコードを編集します。 47 | * ソースコードは `rails6-compose/apps/myapp` フォルダにあります。 48 | 49 | ### `Gemfile` の編集 50 | 51 | テキストエディタで `Gemfile` を開き、次のような記述を見つけてください。 52 | 53 | ``` 54 | gem 'bootsnap', '>= 1.1.0', require: false 55 | ``` 56 | 57 | この直後に、次の記述を挿入してください。 58 | 59 | ``` 60 | gem 'webpacker' 61 | ``` 62 | 63 | `Gemfile` 末尾にある次の記述を削除してください。 64 | 65 | ``` 66 | gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] 67 | ``` 68 | 69 | ### `config/database.yml` の編集 70 | 71 | テキストエディタで `config` ディレクトリにある `database.yml` を開き、次のような記述を見つけてください。 72 | 73 | ``` 74 | default: &default 75 | adapter: postgresql 76 | encoding: unicode 77 | # For details on connection pooling, see Rails configuration guide 78 | # https://guides.rubyonrails.org/configuring.html#database-pooling 79 | pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 80 | ``` 81 | 82 | この直後に、次の記述を挿入してください。 83 | 84 | ``` 85 | host: db 86 | username: postgres 87 | password: 88 | ``` 89 | 90 | ※ 各行の先頭に半角スペースを 2 個置いてください。 91 | 92 | ## Rails アプリケーションのセットアップ 93 | 94 | Web コンテナにログインして以下のコマンド群を実行します。 95 | 96 | ``` 97 | $ cd /apps/myapp 98 | $ bundle 99 | $ bin/rails webpacker:install 100 | $ bin/rails db:create 101 | ``` 102 | 103 | ※ `myapp` の部分は適宜置き換えてください。 104 | 105 | ## スタイルシートの移設 106 | 107 | 引き続き、Web コンテナで以下のコマンド群を実行します。 108 | 109 | ``` 110 | $ mkdir app/javascript/stylesheets 111 | $ cp app/assets/stylesheets/scaffold.css app/javascript/stylesheets 112 | $ rm -rf app/assets 113 | ``` 114 | 115 | テキストエディタで `app/javascript/packs/application.js` を開き、内容をすべて削除してから、次の内容を書き加えます。 116 | 117 | ``` 118 | import "../stylesheets/scaffold.css"; 119 | ``` 120 | 121 | ## レイアウトテンプレートの書き換え 122 | 123 | テキストエディタで `app/javascript/packs/application.js` を開き、次のような記述を見つけてください。 124 | 125 | ``` 126 | <%= stylesheet_link_tag 'application', media: 'all' %> 127 | ``` 128 | 129 | この部分を次のように書き換えてください。 130 | 131 | ``` 132 | <%= stylesheet_pack_tag 'application', media: 'all' %> 133 | ``` 134 | 135 | ## Scaffold の作成 136 | 137 | ここまでの作業がうまく進んでいることを確認するため、簡単なユーザー管理をする Scaffold を作ります。 138 | 139 | Web コンテナで以下のコマンド群を実行します。 140 | 141 | ``` 142 | $ bin/rails g scaffold user name:string 143 | $ bin/rails db:migrate 144 | ``` 145 | 146 | 2 番目のコマンドを実行した結果、ターミナルに次のように表示されれば OK です。ただし、数字の部分は異なります。 147 | 148 | ``` 149 | == 20190219014032 CreateUsers: migrating ====================================== 150 | -- create_table(:users) 151 | -> 0.0092s 152 | == 20190219014032 CreateUsers: migrated (0.0093s) ============================= 153 | ``` 154 | 155 | ## Rails アプリケーションの起動 156 | 157 | ホスト OS で別のターミナルを開き、Web コンテナにログインして以下のコマンド群を実行します。 158 | 159 | ``` 160 | $ cd /apps/myapp 161 | $ bin/webpack-dev-server 162 | ``` 163 | 164 | ホスト OS でさらに別のターミナルを開き、Web コンテナにログインして以下のコマンド群を実行します。 165 | 166 | ``` 167 | $ cd /apps/myapp 168 | $ bin/rails s 169 | ``` 170 | 171 | ## ブラウザで動作確認 172 | 173 | ホスト OS 側のブラウザで http://localhost:3000/users を開き、「Users」というタイトルのページが開くことを確認します。そして、ユーザーの追加、編集、削除ができることを確認します。 174 | 175 | ## Scaffold の破棄 176 | 177 | 動作検証のために作った Scaffold を破棄するため、Web コンテナで以下のコマンド群を実行してください。 178 | 179 | ``` 180 | $ bin/rails db:rollback 181 | $ bin/rails d scaffold user 182 | ``` 183 | 184 | ## Rails アプリケーションの停止 185 | 186 | Rails アプリケーション起動のために開いたふたつのターミナルでそれぞれ `Ctrl-C` キーを押すと、Rails アプリケーションが停止します。 187 | 188 | ## コンテナ群の停止 189 | 190 | 開発作業を終えてパソコンの電源を切る前に DB コンテナと Web コンテナを停止します。 191 | 192 | ``` 193 | % docker-compose stop 194 | ``` 195 | 196 | ソースコードやデータベースの中身は保存されているので、ホスト OS を起動しなおしても `docker-compose up -d` コマンドでコンテナ群を起動すれば、前回の状態から開発作業を続行できます。 197 | 198 | ## トラブル・シューティング 199 | 200 | ### OCI runtime create failed: container with id exists 201 | 202 | 症状: `docker-compose up -d` 実行時に次のようなエラーが出てコンテナ群が起動しない。 203 | 204 | ``` 205 | ERROR: for db Cannot start service db: 206 | OCI runtime create failed: container with id exists: 207 | 54337133f5c4e8a0e25730ec5d5fe73a369053f7cb86801d1d235228426c9581: unknown 208 | ``` 209 | 210 | コンテナ群を停止し、ホスト OS からログアウトしてから、再びホスト OS にログインしてコンテナ群を起動しようとするときに、この症状が出ることがあります。根本的な解決策はまだ見つかっていません。 211 | 212 | とりあえずの回避策は、エラーメッセージに含まれるコンテナの `id` を指定してコンテナを削除することです。上記の例では `54337` で始まる 64 桁の 16 進数がコンテナの `id` ですので、次のコマンドを実行すればコンテナ群を起動できるようになります。 213 | 214 | ``` 215 | % docker rm 54337133f5c4e8a0e25730ec5d5fe73a369053f7cb86801d1d235228426c9581 216 | ``` 217 | 218 | このコマンドの実行により DB コンテナが削除されますが、PostgreSQL のデータを格納しているボリュームはそのまま残されているため、コンテナ群を起動すればデータベースの内容は元通りです。 219 | 220 | しかし、単に `docker compose up -d` コマンドを実行すると Web コンテナが再構築されてしまうので、前回までの開発作業で Web コンテナにログインして行った操作の結果(例えば、`bundle install` による Gem パッケージ群のインストール)が消えてしまいます。 221 | 222 | Web コンテナを再構築せずにそのまま起動するには、次のように `--no-recreate` オプションを加えてください。 223 | 224 | ``` 225 | % docker-compose up -d --no-recreate 226 | ``` 227 | --------------------------------------------------------------------------------