前号では、Ruby on Rails アプリケーションをコンテナ化する方法について説明しました。今回は、コンテナーで日常的なタスクを実行する方法を説明します。
Rake タスクと Rails コマンドを実行する
Rake タスクの実行は簡単です。イメージをビルドしたら、docker-compose を使用してイメージ内でコマンドを実行できます。たとえば、アプリケーションのルートを表示したい場合:
<code class="language-bash">$ docker-compose run web rails routes</code>
同様に、データベースを作成する場合は、データを移行して設定します。
<code class="language-bash">$ docker-compose run web rails db:create db:migrate db:seed</code>
テスト スイートを実行したい場合は、テスト データベースを作成する必要があります:
<code class="language-bash">$ docker-compose run web rails db:create db:migrate RAILS_ENV=test</code>
次に、テスト スイートを実行します (デフォルトで rake が rake テストを実行すると仮定します):
<code class="language-bash">$ docker-compose run web rake</code>
ヒント: カスタム スクリプト/エイリアスを作成する
私は docker-compose run web rails ...
を 1 日に何百回も実行します。作業を簡単にするために、$PATH
内に次のスクリプトを入れます:
<code class="language-bash">#!/bin/bash docker-compose run web rails "$@"</code>
このスクリプトは、docker-compose.yml
ファイルに Web サービスがあることを前提としていることに注意してください。そうしないと機能しません。
他のタスクを実行する
これまでのところ、すべてのコマンドは非常にシンプルで簡単なので、Web サービスで実行するだけで済みます。では、既存のデータベースをコンテナーのデータベースにロードするなど、より難しいタスクの場合はどうするのでしょうか?これは、理解するのに少し時間がかかったタスクの 1 つでした。
PostgreSQL では、ダンプ ファイルの形式に応じて、これを行う 2 つの方法があります。以前は、--format=c
ダンプと通常のダンプに対処する必要がありました。
C 形式の PostgreSQL ダンプを含む latest.dump
ファイルがあり、それを (実行中の) コンテナーにロードしたいとします。まず、コンテナー ID を見つける必要があります。これを行うには、次のコマンドを実行します:
<code class="language-bash">$ docker container ls</code>
または
<code class="language-bash">$ docker ps</code>
コンテナー ID (この例では 80f8041db4b4
を使用します) を取得したら、次のコマンドを実行してコンテナーにダンプを復元できます:
<code class="language-bash">$ docker exec -i 80f8041db4b4 pg_restore -d app_development -U postgres</code>
通常のダンプ (latest.sql
など) がある場合は、次のコマンドを使用してそれを復元できます:
<code class="language-bash">$ docker exec -i 80f8041db4b4 psql -d app_development -U postgres</code>
docker-compose を使用している場合は、作業がより簡単になります。
<code class="language-bash">$ docker-compose exec -T db pg_restore -d app_development -U postgres</code>
すべてがコンテナ化されています!
私は Elastic Beanstalk をよく使用します。通常、Homebrew を使用してインストールしますが、Python、SQLite などの独自の依存関係が多数インストールされます。特に Python バージョンでは常に問題が発生するため、これをすべて自分のシステムに組み込むことは望ましくありません。代わりに、それをコンテナ化します:docker-awsebcli
。
次号もお楽しみに!
以上が開発中の Docker: エピソード 3の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。