Dockerを利用して Rails の環境構築
以下の操作は macOS にて作業しており、Docker や tree コマンドがインストールされていることが前提です。
作業ディレクトを作成
$ mkdir docker-rails $ cd docker-rails
MySql 関連の Docker 設定
db.dockerfile の作成。
FROM mysql:8.0
COPY ./mysql-conf/locale.gen /etc/locale.gen
RUN sed -i 's@archive.ubuntu.com@ftp.jaist.ac.jp/pub/Linux@g' /etc/apt/sources.list
RUN set -ex && \
apt-get update -qq && \
: "Install locales" && \
apt-get install -y --no-install-recommends locales && \
: "Cleaning..." && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
locale-gen ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
mysql-conf/locale.gen の作成。
ja_JP.UTF-8 UTF-8
mysql-conf/charset.cnf の作成。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
mysql-conf/my.cnf の作成。
[mysqld]
default_authentication_plugin=mysql_native_password
Rails 関連の Docker 設定
web.dockerfile の作成。
FROM ruby:3.1.2
ENV LANG C.UTF-8
ENV TZ Asia/Tokyo
WORKDIR /usr/src
RUN sed -i 's@archive.ubuntu.com@ftp.jaist.ac.jp/pub/Linux@g' /etc/apt/sources.list
RUN set -ex && \
apt-get update -qq && \
apt-get install -y --no-install-recommends sudo && \
: "Install node.js" && \
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - && \
apt-get update -qq && \
apt-get install -y --no-install-recommends nodejs && \
: "Install yarn" && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \
apt-get update -qq && \
apt-get install -y --no-install-recommends yarn && \
: "Cleaning..." && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
: "Install rails6.X latest version" && \
gem install rails --version="~>6.1.0"
docker-compose.yml の作成。
version: '3.7'
services:
db:
build:
context: .
dockerfile: ./db.dockerfile
container_name: rails_mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root_passwd
TZ: 'Asia/Tokyo'
volumes:
- ./mysql:/var/lib/mysql
- ./mysql-conf/my.cnf:/etc/mysql/conf.d/my.cnf
- ./mysql-conf/charset.cnf:/etc/mysql/conf.d/charset.cnf
web:
build:
context: .
dockerfile: ./web.dockerfile
container_name: rails_web
volumes:
- ./rails_app/:/usr/src/rails_app/
ports:
- "3000:3000"
environment:
PORT: 3000
BINDING: 0.0.0.0
stdin_open: true
tty: true
links:
- db
実行
Dockerイメージの作成、コンテナのビルド、そしてコンテナの起動/接続/終了。
$ tree . ├── db.dockerfile ├── docker-compose.yml ├── mysql-conf │ ├── charset.cnf │ ├── locale.gen │ └── my.cnf └── web.dockerfile 1 directory, 6 files $ docker-compose build --no-cache $ docker-compose up -d $ docker-compose exec web rails new rails_app --database=mysql $ docker-compose exec web /bin/sh -c "sed -ie 's/password:/password: root_passwd/g' /usr/src/rails_app/config/database.yml" $ docker-compose exec web /bin/sh -c "sed -ie 's/host: localhost/host: db/g' /usr/src/rails_app/config/database.yml" $ docker-compose exec web /bin/sh -c "cd /usr/src/rails_app && rails db:create" $ docker-compose exec web /bin/sh -c "cd /usr/src/rails_app && rails server"
http://localhost:3000/
rails コンソールと MySQL
$ docker-compose exec web bash root@web$ cd /usr/src/rails_app root@web$ rails c irb(main):001:0> Date.current => Wed, 18 Aug 2021 irb(main):002:0> ^D root@web$ exit $
$ docker-compose exec db bash root@db$ mysql -u root -p Enter password: root_passwd mysql> show databases; +-----------------------+ | Database | +-----------------------+ | information_schema | | mysql | | performance_schema | | rails_app_development | | rails_app_test | | sys | +-----------------------+ 6 rows in set (0.00 sec) mysql> exit root@db$ exit $
終了と再起動
終了
$ docker-compose down
再起動
$ docker-compose up -d $ docker-compose exec web /bin/sh -c "cd /usr/src/rails_app && bundle install" $ docker-compose exec web /bin/sh -c "cd /usr/src/rails_app && rails server"
最後に
一連の作業を簡単に行えるように、シェルスクリプトやMakefileを作っておくと良いかもしれません。