Agent-almanac create-r-dockerfile
install
source · Clone the upstream repo
git clone https://github.com/pjt222/agent-almanac
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/ja/skills/create-r-dockerfile" ~/.claude/skills/pjt222-agent-almanac-create-r-dockerfile-6d5f53 && rm -rf "$T"
manifest:
i18n/ja/skills/create-r-dockerfile/SKILL.mdsource content
R Dockerfileの作成
rockerベースイメージを使用し、適切な依存関係管理を行うRプロジェクト用Dockerfileを構築する。
使用タイミング
- Rアプリケーションや分析のコンテナ化
- 再現可能なR環境の構築
- Rベースサービス(Shiny、Plumber、MCPサーバー)のデプロイ
- 一貫した開発環境のセットアップ
入力
- 必須: 依存関係を持つRプロジェクト(DESCRIPTIONまたはrenv.lock)
- 必須: 用途(開発、本番、またはサービス)
- 任意: Rバージョン(デフォルト: 最新安定版)
- 任意: 必要な追加システムライブラリ
手順
ステップ1: ベースイメージの選択
| ユースケース | ベースイメージ | サイズ |
|---|---|---|
| 最小限のRランタイム | | 約800MB |
| tidyverse付き | | 約1.8GB |
| RStudio Server付き | | 約1.9GB |
| Shinyサーバー | | 約2GB |
期待結果: プロジェクトの要件に合致し、不要な肥大化のないベースイメージが選択される。
失敗時: どのイメージを使用するか不明な場合は、
rocker/r-ver(最小限)から始めて必要に応じてパッケージを追加する。完全なイメージカタログはrocker-orgを参照。
ステップ2: Dockerfileの作成
FROM rocker/r-ver:4.5.0 # システム依存関係のインストール # 目的別にグループ化して明確にする RUN apt-get update && apt-get install -y \ # HTTP/SSL libcurl4-openssl-dev \ libssl-dev \ # XML処理 libxml2-dev \ # Git統合 libgit2-dev \ libssh2-1-dev \ # グラフィックス libfontconfig1-dev \ libharfbuzz-dev \ libfribidi-dev \ libfreetype6-dev \ libpng-dev \ libtiff5-dev \ libjpeg-dev \ # ユーティリティ git \ curl \ && rm -rf /var/lib/apt/lists/* # Rパッケージのインストール # 順序: キャッシュ効率のため変更頻度の低いものから RUN R -e "install.packages(c( \ 'remotes', \ 'devtools', \ 'renv' \ ), repos='https://cloud.r-project.org/')" # 作業ディレクトリの設定 WORKDIR /workspace # renvファイルを先にコピー(キャッシュレイヤー) COPY renv.lock renv.lock COPY renv/activate.R renv/activate.R # ロックファイルからパッケージを復元 RUN R -e "renv::restore()" # プロジェクトファイルをコピー COPY . . # デフォルトコマンド CMD ["R"]
期待結果:
docker build -t myproject . でDockerfileが正常にビルドされる。
失敗時:
apt-get install中にビルドが失敗した場合、対象ディストロ(Debian)のパッケージ名を確認する。renv::restore()が失敗した場合、renv.lockとrenv/activate.Rがrestoreステップの前にコピーされていることを確認する。
ステップ3: .dockerignoreの作成
.git .Rproj.user .Rhistory .RData renv/library renv/cache renv/staging docs/ *.tar.gz
期待結果:
.dockerignoreがGit履歴、IDEファイル、ローカルrenvライブラリ、ビルド成果物をDockerコンテキストから除外する。
失敗時: Dockerビルドが不要なファイルをコピーし続ける場合、
.dockerignoreがDockerfileと同じディレクトリにあり、正しいグロブパターンを使用していることを確認する。
ステップ4: ビルドとテスト
docker build -t r-project:latest . docker run --rm -it r-project:latest R -e "sessionInfo()"
期待結果: コンテナが正しいRバージョンですべてのパッケージが利用可能な状態で起動する。
sessionInfo()の出力で期待されるRバージョンが確認できる。
失敗時: ビルドログでシステム依存関係のエラーを確認する。不足している
-devパッケージをapt-get installレイヤーに追加する。
ステップ5: 本番環境向け最適化
本番デプロイにはマルチステージビルドを使用する:
# ビルドステージ FROM rocker/r-ver:4.5.0 AS builder RUN apt-get update && apt-get install -y libcurl4-openssl-dev libssl-dev COPY renv.lock . RUN R -e "install.packages('renv'); renv::restore()" # ランタイムステージ FROM rocker/r-ver:4.5.0 COPY --from=builder /usr/local/lib/R/site-library /usr/local/lib/R/site-library COPY . /app WORKDIR /app CMD ["Rscript", "main.R"]
期待結果: マルチステージビルドにより最終イメージが小さくなる。ランタイムステージにはコンパイル済みRパッケージのみが含まれ、ビルドツールは含まれない。
失敗時: ランタイムステージでパッケージの読み込みに失敗する場合、
COPY --from=builderのライブラリパスがRのインストール先と一致していることを確認する。両方のステージでR -e ".libPaths()"で確認する。
バリデーション
-
がエラーなく完了するdocker build - コンテナが起動しRセッションが動作する
- すべての必要なパッケージが利用可能
-
が不要なファイルを除外している.dockerignore - イメージサイズがユースケースに対して適切
- コード変更のみの場合のリビルドが高速(レイヤーキャッシュが機能)
よくある落とし穴
- システム依存関係の不足: コンパイルコードを含むRパッケージには
ライブラリが必要。-dev
中のエラーメッセージを確認するinstall.packages() - レイヤーキャッシュの無効化: パッケージインストール前にすべてのファイルをコピーすると、コード変更のたびにキャッシュが無効化される。先にロックファイルをコピーする
- 大きなイメージ:
の後にapt-get install
を使用する。マルチステージビルドを検討するrm -rf /var/lib/apt/lists/* - タイムゾーンの問題: タイムゾーン対応の操作には
を追加するかENV TZ=UTC
をインストールするtzdata - rootでの実行: 本番環境には非rootユーザーを追加する:
RUN useradd -m appuser && USER appuser
例
# ソースをマウントした開発コンテナ docker run --rm -it -v $(pwd):/workspace r-project:latest R # Plumber APIサービス docker run -d -p 8000:8000 r-api:latest # Shinyアプリ docker run -d -p 3838:3838 r-shiny:latest
関連スキル
- 複数コンテナのオーケストレーションsetup-docker-compose
- MCP Rサーバーの特殊ケースcontainerize-mcp-server
- 高度なキャッシュ戦略optimize-docker-build-cache
- renv.lockがDockerビルドに入力されるmanage-renv-dependencies