安易。
MariaDBとかは他コンテナで建てるものとします。
Dockerfile
FROM node:lts-slim AS node
FROM ruby:3
COPY --from=node /opt/ /opt/
COPY --from=node /usr/local/lib/ /usr/local/lib/
COPY --from=node /usr/local/bin/ /usr/local/bin/
RUN apt update && apt upgrade -y && apt install -y g++
RUN gem install rails
ちょっと説明
マルチステージビルドする
NodeイメージからNodeインタプリタのあるディレクトリをごっそりを持ってくる。
Nodeの特定バージョンを入れようと思うとcurlでインストーラとってきて、スクリプト実行して、必要ならyarnを別で入れるなどちょっとめんどくさい。
でもマルチステージビルドならDocker Official ImageのNodeインタプリタを拾えるし、バージョン指定はイメージのタグを変えればいいだけなのでちょっと楽。
# Nodeインタプリタをとってくるイメージ
FROM node:lts-slim AS node
# 最後に書いたFROMがイメージのベースになる
FROM ruby:3
# インタプリタの含まれるディレクトリをコピー
COPY --from=node /opt/ /opt/
COPY --from=node /usr/local/lib/ /usr/local/lib/
COPY --from=node /usr/local/bin/ /usr/local/bin/
RUN apt update && apt upgrade -y && apt install -y vim g++ # <- Nodeの駆動にg++が必要
参考: Multi-stage build でNode.jsのインストールをちょっぴり効率化する - アクトインディ開発者ブログ
railsのインストール
グローバルにインストール。
あとはdocker run -it <image name> bash
とかしてコンテナ内でrails new app
とかすると準備完了。
RUN gem install rails