Ruby on Rails をコンテナを使って開発をするときには、ベースになる gem までがインストールされたコンテナに対して、開発するソースコードや追加の gem(rails含む) については volume でコンテナ以外に保持して永続化すると開発中にコンテナを更新する必要が無いため効率的だと考えている。
環境構築
Ruby と gemをインストールした コンテナ生成
Ruby のインストールを、DockerHubの公式を参考にdockerfileを作成。
サンプルのタイミングでの最新だった ruby : 3.2.2 、rails : 7.0.5 で作成する。
docker image build でイメージを作成する。
FROM debian:bullseye-slim
ENV LANG C.UTF-8
ENV user you
RUN \
# 必要なパッケージインストール
apt update && apt upgrade -y \
&& apt install -y --no-install-recommends \
make \
gcc \
g++ \
sudo \
openssl \
ca-certificates \
libssl-dev \
zlib1g-dev \
curl \
wget \
apt-transport-https \
aria2 \
git \
vim \
libyaml-dev \
xz-utils \
zlib1g-dev \
locales \
sqlite3 \
libpq-dev \
patch \
# ユーザの追加
&& groupadd -g 1111 ${user} \
&& useradd -m -u 1111 -g 1111 ${user} \
# rails アプリ用のディレクトリ作成
&& mkdir /app /app/forest/bundle_dir \
&& chown -R ${user}:${user} /app \
&& chown -R ${user}:${user} /app/bundle_dir
USER ${user}
RUN \
# 日本語化
locale-gen ja_JP.UTF-8 \
# rbenv用 ディレクトリ作成
&& mkdir /home/${user}/.rbenv \
# rbenv インストール
&& export GIT_SSL_NO_VERIFY=1 \
&& git clone https://github.com/rbenv/rbenv.git /home/${user}/.rbenv \
&& cd ~/.rbenv \
&& src/configure \
&& make -C src \
# ruby-build & ruby3.2.2
&& export PATH="/home/${user}/.rbenv/bin:$PATH" \
&& eval "$(/home/${user}/.rbenv/bin/rbenv init - bash)" \
&& echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bashrc \
&& echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc \
&& export GIT_SSL_NO_VERIFY=1 \
&& git clone https://github.com/rbenv/ruby-build.git /home/${user}/.rbenv/plugins/ruby-build \
&& /home/${user}/.rbenv/bin/rbenv install 3.2.2 \
&& /home/${user}/.rbenv/bin/rbenv global 3.2.2 \
&& gem update --system
EXPOSE 3000
ENV APP_ROOT /app
WORKDIR $APP_ROOT
CMD ["/bin/bash"]
コンテナで rails 環境 作成
コンテナを作成し、コンテナ内に入る。
docker run -it -p 3000:3000 -v /path_to/app:Z -v ~/path_to/bundle-dir:/app/bundle_dir:Z -v <コンテナイメージ名> /bin/bash"
Rails の実行、アプリの生成
/app に Gemfile を作成。まずは rails を指定。
<Gemfile>
ruby '3.2.2'
gem "rails", "7.0.5"
gem "pg" # postgresを使う場合 DBに応じて変更
gem のインストール先を設定。
bundle config set path /app/bundle_dir
gem のインストール
railsは、Gemfileで一気にインストールできないみたい。以下のエラーが出る。
Could not find gem 'rails (= 7.0.5)' in locally installed gems.
Run bundle install
to install missing gems.
なので、最初にrailsのみインストール
gem install rails -v 7.0.5
その後に、bundle install でGemfile記載のものをインストール
bundle install
rails アプリの生成
bundle exec rails new <アプリ名>
このようにすることで、新たに追加していくgemも docker の volume の機能で永続化できて開発中の追加や削除に対してもコンテナは影響を受けない。
また、アプリのソースコードもホストと共有できるので、ホスト側でソースコードの作成・編集を行いコンテナはサーバの実行(bundle exec rails s)などのrailsコマンドの実行だけを行えば開発が成立する。
コメント