DockerでRails環境をつくってみた
概要
DockerでRails環境を作りました。
環境
目標
db含めコンテナとホストをマウントさせつつ、この画面を出すことを目標とします。
手順
Dockerはインストールされている前提で進めます。
1. ディレクトリとファイル構成
適当なディレクトリを作り、ファイル構成を以下のようにします。
. ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── docker-compose.yml ├── .env
2. Dockerfile定義
imageの元となるDockerfileを定義します。
SugitoClub(僕が所属する社会人サッカーチームの名前(応援よろしくお願いします笑))というディレクトリをコンテナ上に作り、そのディレクトリをワーキングディレクトリとします。
Rubyイメージ自体がDebianイメージをベースにしているため、apt-getとかしているようです。
FROM ruby:2.5.0 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /SugitoClub WORKDIR /SugitoClub COPY Gemfile /SugitoClub/Gemfile COPY Gemfile.lock /SugitoClub/Gemfile.lock COPY . /SugitoClub RUN bundle install
3. Gemfile*定義
ホストのGemfileをコンテナ側にコピーし、bundle installしたものをimageとするためにGemfileとGemfile.lockを作る必要があります。
Gemfile
source 'https://rubygems.org' gem 'rails', '5.1.5'
Gemfile.lockは作っておくだけで大丈夫です。
$ touch Gemfile.lock
4. docker-copose.yml定義
コンテナを実行しているホストのディレクトリを、コンテナ内のディレクトリとしてマウントすることができます。 このマウントされた領域をVolumeというそうです。 volumesで「ホスト : コンテナ」とすることでマウントできます。
version: '3' services: db: image: mysql:5.7 env_file: .env ports: - "3306:3306" volumes: - ./db/mysql_data:/var/lib/mysql:cached web: build: . depends_on: - db command: bundle exec rails s -p 3000 -b '0.0.0.0' ports: - 3000:3000 volumes: - .:/SugitoClub:cached
5. .env定義
docker-compose.ymlで参照するenvfileです。
MYSQL_USER=任意のユーザー名 MYSQL_ROOT_PASSWORD=任意のパスワード
6. 実行
$ docker-compose run web rails new . --force --database=mysql $ docker-compose up --build
rails newでGemfile*が更新されているのでイメージをビルドし直す必要があります。 localhost:300にアクセスすると期待していた画像がでてきました。
まとめ
最後の方はかなり端折ってしまいましたが、思っていたより簡単に環境をつくることができました。
Shut the fuck up and write some codeが沁みますね。