Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【Docker】Railsでgemをcacheする

More than 1 year has passed since last update.

概要

以下のようなスタンダードなdocker-compose.ymlが存在するとします。
このままではgemを追加する度にdocker-compose buildをする必要があり、buildの度にかなりの時間がかかります。これは、buildの度にgemファイルを一からインストールし直すためです。

そこで、gemを追加する際に追加したgemのみインストールする方法を紹介します。

docker-compose.yml
version: "3"
services:
  app:
    build: .
    volumes:
      - .:/app
    depends_on:
      - postgres
  postgres:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

設定

以下の手順で対応を行います。

  • (1) environmentを使用し、BUNDLE_PATHを設定。
  • (2) 名前付きvolumeのbundle_pathを設定し、トップレベルのvolumesに追加します。

実際に書き換えたdocker-compose.ymlは以下のようになります。

docker-compose.yml
version: "3"
services:
  app:
    build: .
    volumes:
      - .:/app
      - bundle_path:/bundle # 追加箇所
    environment:
      - BUNDLE_PATH=/bundle # 追加箇所
    depends_on:
      - postgres
  postgres:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  bundle_path: # 追加箇所
  postgres-data:

使用方法

gemのcache作成

docker-compose.ymlを以下のように変更したらgemのキャッシュを作成する為に以下のコマンドを実行します。

$ docker-compose app bundle install

新しいgemの追加

  • (1) 使用しているコンテナがあれば停止します。
$ docker-compose down
  • (2) gemをGemfileに追加し、インストールします。(新たに追加されたgemの更新のみ実行されます。)
$ docker-compose run app bundle install
  • (3) 再びコンテナを立ち上げます。
$ docker-compose up

以上でgemを追加する度にdocker-compose buildを実行する必要がなく、より効率的に開発を行うことができます。

参考

k-penguin-sato
最近はGoとTypeScriptを頑張ってます。 https://dev.to/ksato1995
updata
不動産DXを推進しています。 主なプロダクト Syncaデータコンバーター Syncaワークフロー Syncaウェブサイト
https://updata.tech
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away