初めに
クィックスタート: Compose と Railsを実際に行って躓いたところや、わからないことをまとめてみました。
同じように悩んでいる方に向けて書きます。
間違っていることを発信いる場合はコメントなどで教えていただけると幸いです。
クィックスタート: Compose と Railsの最終目的
初めにクイックスタートの通りファイルを作成し、記述を行う。
- 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アプリケーションのサーバを実行するサービスを指す。
オプションの解説
--force は新しいrailsアプリケーションが立ち上がるときに強制的に上書きを行う。
--database=postgresqlはrailsアプリケーションが立ち上がると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. ------
FROM:ruby:2.3.3からビルドプロセスのイメージを作成することまではできている。
Failed to fetch http://security.debian.org/dists/jessie/updates/main/binary-amd64/Packages 404 Not Foundからパッケージをインストールしようとしたが、インストール先が見つからない。
ruby:2.3.3のバージョンが古いのでパッケージのダウンロード先が見つからないと仮定する。
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 オプション
$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にアクセスする。