Site cover image
Docker マルチステージビルドでRubyとNodeのハイブリッドイメージを作る

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 --from=build-node-modules /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 --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /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 --from=build-node-modules /app/node_modules node_modules/
COPY --from=build-ruby-gems /app/.bundle .bundle/
COPY --from=build-ruby-gems /app/vendor vendor/

VOLUME /app/node_modules /app/.bundle /app/vendor

COPY . /app

Dockerfile のベストプラクティスは下記にありますので、ぜひこちらもご覧ください。

以上です。

このエントリではRuby on RailsをDockerコンテナで動かすことを想定してマルチステージビルドの使い方を説明しました。

Thank you!
Thank you!
URLをコピーしました

コメントを送る

コメントはブログオーナーのみ閲覧できます