クィックスタート: Compose と Rails!を行った時の生じたエラーや用語のまとめ

初めに

  • クィックスタート: Compose と Railsを実際に行って躓いたところや、わからないことをまとめてみました。

  • 同じように悩んでいる方に向けて書きます。

  • 間違っていることを発信いる場合はコメントなどで教えていただけると幸いです。

クィックスタート: Compose と Railsの最終目的

  • docker-composeを使用して簡易的にrailsを立ち上げてみる。

  • 使用するアプリケーションはrails

  • データベースは,postresSQL。

初めにクイックスタートの通りファイルを作成し、記述を行う。

  • quick-startフォルダを作成し移動する。
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とは?
  • プロジェクトに使用されているgemの正確なバージョン記載がされている。

  • bundle install後に記述が追加される。

プロジェクトのひな型を作成する。

  • docker-compose run web rails new . --force --database=postgresqlを実行する。

    コマンドの解説
  • docker-compose run はdocker-compose.ymlをベースとして実行を行う。

  • webは docker-compose.ymlに記述されているサービス名で、webアプリケーションのサーバを実行するサービスを指す。

  • rails new .はコンテナ内の作業ディレクトリ内で新しいアプリケーションを立ち上げると言う意味を示す。

オプションの解説
  • --force は新しいrailsアプリケーションが立ち上がるときに強制的に上書きを行う。

  • --database=postgresqlrailsアプリケーションが立ち上がるとPostgresSQLに接続を行うように設定される。またこのオプションによりconfig/database.yml ファイルが PostgreSQL の接続設定で初期化される。

エラー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のバージョンが古いのでパッケージのダウンロード先が見つからないと仮定する。
  • ruby:2.3.3→ruby:2.5に変えてみる。

  • docker-compose run web rails new . --force --database=postgresqlがうまく走る。

ファイル一覧を確認する。

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
  • 通常のユーザーが管理者権限を使ってコマンドを実行するために使用。

    chown
  • ファイルやディレクトリの所有者とグループを変更するための使用する。

-R オプション
  • recursivenの略で再帰的という意味を示す。(フィードバック)

  • chownの下に指定したファイルやディレクトリに対して再帰的に所有者の変更を行う。

$USER:$USER
  • $USERという環境変数はログインしたユーザーのユーザー名を格納している。

  • $USER:$USERとすることで所有者とグループの所有者を現在の所有者にする。

  • 最初の$USERが新しい所有者を指定して、後の$USERが新しいグループを指定する。

.
  • 現在使用しているカレントディレクトリのことを示す。

  • 現在のディレクトリとその中に入っているファイルやサブディレクトリの所有者を実行中のユーザーに変更する。

プロジェクトの再ビルド

  • rals newを行った際にdcokerfileやGemfileの内容が変更されたので再度docker-compose buildを行う。
$ docker-compose build

データベースの接続設定

  • Dockerコンテナーを使用して PostgreSQL データベースと接続を行う。

  • config/database.ymlの変更を行う。

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
  • docker-compose upを実行する。

エラー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 の「ようこそ」ページの確認

  • docker-compose upを実行する。

  • ブラウザで確認するためにhttp://localhost:3000にアクセスする。

結語

  • 今回docker-composeを使用してRailsのアプケーションを立ち上げたが、コードの関するエラーはもちろんのこと、Railsのバージョン管理に関しても学習しなければいけないと感じました。

  • Rails、dockerの公式ドキュメントを英語で読むことも非常に重要であると感じました。