Dockerのマルチステージビルドを使えば、例えばRubyとNodeの両方の実行環境を持ったDockerイメージを簡単に作ることができます。
このエントリでは、Ruby on RailsをDockerコンテナで動かすことを想定してマルチステージビルドの使い方を説明します。
マルチステージビルドとは、結果から言ってしまえばDockerfileに複数のFROM命令を書くことです。
実際の例を見てみましょう。
下記はNodeイメージを使って node_modules
以下にパッケージをインストールした後、Rubyイメージを使ったビルドで node_modules
をコピーしています。
FROM node:14.17-slim AS build-node-modules
WORKDIR /app
COPY package.json /app/
COPY yarn.lock /app/
RUN yarn install
FROM ruby:2.7.2-slim
WORKDIR /app
COPY /app/node_modules node_modules/
マルチステージビルドでは、FROM命令に AS
構文を使ってステージに名前をつけることができます。名前を付けず、0から始まり順次割り振られる整数値を使うこともできます。
COPY --from
命令ではステージ名を使って外部イメージからコピーすることができます。
最後に、Nodeバイナリを持ったRubyイメージを作成するDockerfileの例を載せておきます。
依存する RubyGems によって必要なライブラリが異なってくるので、ご自身の環境に適宜読み替えてください。
また、必要なライブラリはそれぞれの RubyGems のホームページを参照してください。
例えば Nokogiri ですと下記に記載されています。
FROM node:14.17-slim AS node
FROM node:14.17-slim AS build-node-modules
WORKDIR /app
COPY package.json /app/
COPY yarn.lock /app/
RUN yarn install
FROM ruby:2.7.2-slim AS ruby-base
WORKDIR /app
ENV BUNDLE_APP_CONFIG .bundle
ENV BUNDLE_PATH vendor/bundle
# For nokogiri
# https://nokogiri.org/tutorials/installing_nokogiri.html#installing-using-standard-system-libraries
# For mysql
# https://github.com/brianmario/mysql2#linux-and-other-unixes
RUN apt-get update -y && apt-get install -y \
build-essential \
pkg-config libxml2-dev libxslt-dev \
libmariadb-dev
FROM ruby-base AS build-ruby-gems
COPY Gemfile* /app/
RUN bundle config build.nokogiri --use-system-libraries \
&& bundle install -j4
FROM ruby-base
WORKDIR /app
RUN apt-get install -y \
tzdata \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
COPY /usr/local/bin/node /usr/local/bin/
COPY /opt/yarn* /opt/yarn/
RUN ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \
&& ln -s /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg
COPY /app/node_modules node_modules/
COPY /app/.bundle .bundle/
COPY /app/vendor vendor/
VOLUME /app/node_modules /app/.bundle /app/vendor
COPY . /app
Dockerfile のベストプラクティスは下記にありますので、ぜひこちらもご覧ください。
以上です。
このエントリではRuby on RailsをDockerコンテナで動かすことを想定してマルチステージビルドの使い方を説明しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます