初めに
クィックスタート: Compose と Railsの最終目的
初めにクイックスタートの通りファイルを作成し、記述を行う。
mkdir quick-start
cd mkdir
- quick-startフォルダ内に移動してDockerfile,Gemfile,Gemfile.lockを作成。
touch Dockerfile Gemfile Gemfile.lock
Dockerfile
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
Gemfile
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
- docker-compose.ymlを作成して記述を行う。
touch docker-compose.yml
docker-compose.yml
version: '3'
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
Dockerfileとは?
FROM, RUN, CMD, EXPOSE, ENV, ADD, および COPYといったドッカーコンストラクションを利用して記述する。
Dockerfileの最初にはFROMを使用してビルドプロセスのイメージを作成する。
Gemfileとは?
Railsで必要となる道具をリストアップしてまとめたファイル。
一括でインストールしたり、バージョンを揃えることができるので開発がスムーズになる。
gemfile内の内容を変更したり、追加したらbundle installを行う。
Gemfile.lockとは?
プロジェクトのひな型を作成する。
docker-compose run web rails new . --force --database=postgresqlを実行する。
コマンドの解説
docker-compose run はdocker-compose.ymlをベースとして実行を行う。
webは docker-compose.ymlに記述されているサービス名で、webアプリケーションのサーバを実行するサービスを指す。
rails new .はコンテナ内の作業ディレクトリ内で新しいアプリケーションを立ち上げると言う意味を示す。
オプションの解説
エラー1
- ERROR [web 2/8] RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejsが生じる。
エラー内容
> [web 2/8] RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs:
14.59 W: Failed to fetch http://security.debian.org/dists/jessie/updates/main/binary-amd64/Packages 404 Not Found [IP: 151.101.2.132 80]
14.59
14.59 W: Failed to fetch http://deb.debian.org/debian/dists/jessie/main/binary-amd64/Packages 404 Not Found
14.59
14.59 W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/main/binary-amd64/Packages 404 Not Found
14.59
14.59 E: Some index files failed to download. They have been ignored, or old ones used instead.
------
ruby:2.3.3のバージョンが古いのでパッケージのダウンロード先が見つからないと仮定する。
ファイル一覧を確認する。
total 64
-rw-r--r--@ 1 seinokyouhei staff 219 4 18 18:29 Dockerfile
-rw-r--r--@ 1 seinokyouhei staff 1738 4 18 18:31 Gemfile
-rw-r--r--@ 1 seinokyouhei staff 4827 4 18 18:32 Gemfile.lock
-rw-r--r-- 1 seinokyouhei staff 374 4 18 18:31 README.md
-rw-r--r-- 1 seinokyouhei staff 227 4 18 18:31 Rakefile
drwxr-xr-x@ 10 seinokyouhei staff 320 4 18 18:32 app
drwxr-xr-x@ 8 seinokyouhei staff 256 4 18 18:33 bin
drwxr-xr-x@ 14 seinokyouhei staff 448 4 18 18:32 config
-rw-r--r-- 1 seinokyouhei staff 130 4 18 18:31 config.ru
drwxr-xr-x@ 3 seinokyouhei staff 96 4 18 18:32 db
-rw-r--r--@ 1 seinokyouhei staff 210 4 18 12:07 docker-compose.yml
drwxr-xr-x@ 4 seinokyouhei staff 128 4 18 18:32 lib
drwxr-xr-x@ 3 seinokyouhei staff 96 4 18 18:32 log
drwxr-xr-x@ 9 seinokyouhei staff 288 4 18 18:32 public
drwxr-xr-x@ 9 seinokyouhei staff 288 4 18 18:32 test
drwxr-xr-x 4 seinokyouhei staff 128 4 18 18:31 tmp
drwxr-xr-x@ 3 seinokyouhei staff 96 4 18 18:32 vendor
- コンテナ側で作成されたファイルの所有者は全てrootユーザによって実行されているのでrootになる。
指定したディレクトリとその中の全てのファイルおよびサブディレクトリの所有者とグループを、実行ユーザーのものに変更
- sudo chown -R $USER:$USER .を実行する。
コマンドの解説
sudo
-R オプション
$USER:$USER
$USERという環境変数はログインしたユーザーのユーザー名を格納している。
$USER:$USERとすることで所有者とグループの所有者を現在の所有者にする。
最初の$USERが新しい所有者を指定して、後の$USERが新しいグループを指定する。
.
プロジェクトの再ビルド
- rals newを行った際にdcokerfileやGemfileの内容が変更されたので再度docker-compose buildを行う。
$ docker-compose build
データベースの接続設定
config/database.yml
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
エラー2
- Error: Database is uninitialized and superuser password is not specified.というエラーが生じる。
db-1 | Error: Database is uninitialized and superuser password is not specified.
db-1 | You must specify POSTGRES_PASSWORD to a non-empty value for the
db-1 | superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db-1 |
db-1 | You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db-1 | connections without a password. This is *not* recommended.
db-1 |
db-1 | See PostgreSQL documentation about "trust":
db-1 | https://www.postgresql.org/docs/current/auth-trust.html
データベースが初期化されておらず、スパーユーザーパスワードが指定されていないから起きたエラー。
POSTGRES_PASSWORDには、superuserに対して空でない値を指定する必要があります。例えば "docker run "で"-e POSTGRES_PASSWORD=password "と指定する。
"POSTGRES_HOST_AUTH_METHOD=trust を使用すればパスワードを指定する必要はないが推奨はされない
今回はパスワードを設定しない方法で行う。
本来はきちんと環境変数の値を入れるが、今回はアプリケーションを立ち上げることを目的としているために、省略します。
docker-compose.ymlに追加
version: '3'
services:
db:
image: postgres
environment:**
POSTGRES_HOST_AUTH_METHOD: trust**
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
- 追加後docker-compose upを行うと無事実行ができました。
データベースの作成を行う。
コンテナーと PostgreSQL データベースの接続ができた。
docker-compose run web rake db:createを実行するしてデータベースを生成する。
以下のメッセージが表示されてデータベースが無事に作成されたことがわかった。
Created database 'myapp_development'
Created database 'myapp_test'
docker-compose run web rake db:createコマンドの解説。
docker-compose runはdocker-compose.ymlに記述されているアプリケーションやデータベースを立ち上げ、コマンドを実行する。
webはdocker-compose.ymlに記述されているアプリケーションのこと。今回はRails。
rakeはRailsのタスクランナーでrake db:createでRailsに関連づけられたデータベースを作成する。config/database.ymlに設定されたデータに基づいて実行される。
Rails の「ようこそ」ページの確認
結語