dockerでアプリを自動起動させるようにする

やりたいこと

dockerを立ち上げてアプリを自動起動するまでの流れ

  • docker-compose upでrailsとDBのコンテナを起動できるようにする。
  • Webアプリを自動で起動できるようにする。

コンテナ化の手順

  • 今回はRailsアプリをコンテナ起動による自動化を目指すためrailsとpostgresをコンテナ化します。
  • コンテナ化に必要なDockerfileと2つのコンテナを使うのでdocker-compose.ymlを用意します。
  • DBの設定に必要なdatabase.ymlファイルも適宜修正します。

 

例 Dockerfile

FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs 
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock
COPY . /rails-docker/
RUN bundle install

 

※アプリ起動の自動化前のため、コンテナを起動するまでに留めてます。

例 docker-compose.yml

version: '3'
volumes:
  db-data:

services:
  web:
    build: .    ports:
      - '3000:3000'
    volumes:
      - '.:/rails-docker'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
      - 'POSTGRES_HOST_AUTH_METHOD=trust'

 

上記設定ファイルを保存したらターミナルにて以下のコマンドを実行しアプリを起動します。

 

railsとpostgresのコンテナを起動

※-dオプションでdetachモード(バックグランド)でコンテナを起動します。

$ docker-compose up -d

 

2つのコンテナが起動したことを確認

$ docker-compose ps

 

コンテナにログイン

※今回の場合は引数にwebを指定してます。

docker-compose exec web bash

 

コンテナにログイン後DBの設定をします。

# rails db:create

# rails db:migrate

rails s -b 0.0.0.0 ※今回はローカルで起動することを想定

 

ブラウザにlocalhost:3000を入力しWebアプリが起動することを確認。

 

上記の記載内容でコンテナ、およびアプリが立ち上がることがわかったので、今度はアプリを自動で起動できるようにdocker-compose.ymlを修正します。

 

例 docker-compose.yml

services:
  web:
    build: .

 以下のDB設定コマンドとrails起動コマンドを追記する

    command: >
      bash -c "rails db:create &&
              rails db:migrate &&
              rails s -b 0.0.0.0"

 

コンテナを一時的に停止し再度立ち上げる

コンテナを停止

docker-compose down

 

コンテナを起動

$ docker-compose up -d

 

ブラウザにlocalhost:3000を入力しコンテナ起動と同時にWebアプリが起動することを確認。

 

まとめ

今回のケースではコンテナ起動と同時にアプリを自動で立ち上げるためにDB設定コマンドとrailsを起動するコマンドを追記するだけでした。

ただ今後より本格的なWebアプリをコンテナ化して自動で起動する際はより複雑な設定をdocker-compose.ymlに追記する必要があるかと思います。