Railsプロジェクト向けの.devcontainer/Dockerfileの一例

未来の自分用のメモです。 

ベースイメージが存在していないToyアプリなどで利用することが多いDockerfileについて紹介します。
Railsで動作させることが前提ですが、空行で表現しているグループごとに説明します。

  1. Localeの設定
    • 設定しないとrails consoleなどでマルチバイト文字でエラー出がち
  2. Timezoneの設定
    • 設定してもしなくてもOK
  3. 各種パッケージのインストール
    • Rubyのビルドや利用したいDBのパッケージなどをインストール
    • 場合によってはツールなどもインストールしても良いかもしれない
  4. UserやWorkdirの設定
    • 移行のRUNがzshで動作することが前提になっているのでSHELLを指定
    • それ以外は特になし
  5. asdfのインストール
    • rbenvやnなどは利用せずasdfを使っている 
  6. RubyやNode.jsをインストール
    • .tool-versionsを解析して、plugin addやinstall、globalまで設定している
    • Globalにしている理由としてはVSCodeのSteep拡張の呼び出しの問題に対しての対策
  7. yarnのインストール
    • Railsだとyarnがデフォルトなので一応入れてる
    • npmで動くように変えてるなら不要

これらをまとめたのが以下になります。

FROM mcr.microsoft.com/devcontainers/base:bookworm

# Configure locales
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8

# Configure timezone
ENV TZ=Asia/Tokyo
RUN sudo ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Install packages
RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    git \
    libssl-dev \
    zlib1g-dev \
    libyaml-dev \
    libreadline-dev \
    libncurses5-dev \
    libffi-dev \
    libgdbm-dev \
    libzmq3-dev \
    libsqlite3-dev \
    libpq-dev \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Configure user and workspace
USER vscode
WORKDIR /workspace
SHELL ["/bin/zsh", "-c"]

# Install asdf
ENV ASDF_VERSION=v0.14.1
RUN git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch $ASDF_VERSION \
    && echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc \
    && echo '. "$HOME/.asdf/asdf.sh"' >> ~/.zshrc

# Install tools via asdf
COPY .tool-versions /workspace/.tool-versions
RUN . $HOME/.asdf/asdf.sh \
    && cat .tool-versions | grep -v '#' | awk '{print $1}' | xargs -n 1 asdf plugin add
RUN . $HOME/.asdf/asdf.sh \
    && asdf install
# Set global versions
RUN . $HOME/.asdf/asdf.sh \
    && cat .tool-versions | grep -v '#' | xargs -n 2 asdf global

# Install yarn
RUN . $HOME/.asdf/asdf.sh \
    npm install -g yarn

CMD ["bash"]

実際のプロダクト開発ではベースイメージを用意しているケースが多いので、このまま利用できるわけではないですが、 あくまでToyアプリなどでは比較的利用しやすいかなと思います。